2010-10-28 22 views
1

我有以下格式的文件:使用python进行快速数据处理?

[s1,s2,s3,s4,...] SOME_TEXT 
(per line) 

例如:

[dog,cat,monkey] 1,2,3 
[a,b,c,d,e,f] 13,4,6 

托架均包括在内。

让我们说我有这样的另一个领域,其中包含两行:

[banana,cat2,monkey2] 1,2,3 
[a2,b2,c2,d,e,f] 13,4,6 

我想采取这种形式的两个文件,并调整它们的方式如下:

[dog^banana,cat^cat2,monkey^monkey2] 1,2,3 
[a^a2,b^b2,c^c2,d^d2,e^e2,f^f2] 13,4,6 

同时使确定相应行(如1,2,3和13,4,6)中的“某些文本”是相同的,并且每个对应行中括号内的元素数目是相同的。什么是一个快速简洁的方法来做到这一点?

谢谢。

回答

0

我会使用正则表达式在第一个](并坚持它)之后切掉所有东西。然后另一个正则表达式将字符串分解为数组。然后做任何你需要做的事情来合并来自不同文件的不同数组,然后将它们拼凑在一起不应该太难。我会离开的正则表达式的作为练习读者:-)

0
for l, m in zip(f1, f2): 
    l_head, l_tail = l.strip("[ ").split("]") 
    m_head, m_tail = m.strip("[ ").split("]") 

    l_head = l_head.split(",") 
    m_head = m_head.split(",") 
    assert len(l_head) == len(m_head) 

    l_tail = l_tail.split(",") 
    m_tail = m_tail.split(",") 
    assert len(l_tail) == len(m_tail) 

    ... 

我没有给你的变量好名字,因为我不知道他们是什么。我会将它们命名为更有用的东西。

我也没有编写重新组装线的代码。它不应该太硬...

3
def read_file(fp,hash): 
    for l in fp: 
     p = l[1:].find(']') 
     k = l[p+3:-1] 
     v = l[1:p+1].split(",") 
     if k not in hash: 
      hash[k] = v 
     else: 
      hash[k] = zip(hash[k], v) 

hash = {} 

for fname in ('f1.txt', 'f2.txt'): 
    with open(fname) as fp: 
     read_file(fp, hash) 

for k,v in hash.items(): 
    print "[{0}] {1}".format(",".join("^".join(vv) for vv in v), k) 

这是做一个基本的方法,如果你需要在他们看到你就必须做更多的工作顺序在文件中的行。

这里的输出我得到:

[a^a2,b^b2,c^c2,d^d,e^e,f^f] 13,4,6 
[dog^banana,cat^cat2,monkey^monkey2] 1,2,3 

编辑:

这还假定每个key即。 13,4,6在文件中出现一次。如果它可以出现多次,你将不得不将哈希[k] = zip(hash [k],v)更精细地改为这样的东西

if k not in hash: 
    hash[k] = [[vv] for vv in v] 
else: 
    for i,vv in enumerate(v): 
     hash[k][i].append(vv) 
+0

这也是我对它的看法。或者,我想知道是否有优点可以跳过split(“,”),并将该值存储为文件中的原始字符串。散列[k] =散列[k] +“,”+ v – gbc 2010-10-28 20:22:56

+0

如果跳过分割该值,则会变得更加混乱,以后再与其他值进行合并。然而,关键不必分裂 – GWW 2010-10-28 20:24:04

+0

的确,我明白你的意思。我浏览了加入“^”的重要位置! – gbc 2010-10-28 20:29:50