2013-05-30 26 views
3

我很努力從另一個文本文件創建一個文本文件。使用重複創建不同的文本文件

我的文本文件是:

0.0 99.13 0.11 
0.5 19.67 0.59 
0.5 22.23 1.22 
1.0 9.67 0.08 

,我想創建一個文本文件,如:

0.0 99.13 0.11 
0.5 19.67 0.59 
1.0 9.67 0.08 

0.0 99.13 0.11 
0.5 22.23 1.22 
1.0 9.67 0.08 

一般來說,每次將有在我的文件的第一列中的重複值我想創建一個文件,只有一個重複項和一個選定的值n行。

到目前爲止我的代碼是:

def createFile(file): 
    with open(file, 'r') as fh: 
     data = fh.read() 
    for row in data.splitlines(): 
     column = row.split() 
     print column 
>>> 
['0.0', '99.13', '0.11'] 
['0.5', '19.67', '0.59'] 
['0.5', '22.23', '1.22'] 
['1.0', '9.67', '0.08'] 

這將讓我的發揮與指標 - 如果列重複[0]或許檢查,然後打印行?或者會創建一個字典更容易?

乾杯, 凱特

+0

重複值可以在非連續行嗎? – Bakuriu

+1

實際上,該列表是排序的,所以重複將始終是連續的行。 – kate88

+0

@ kate88好吧,讓事情變得更容易:) –

回答

2

如果重複,以便分組,使用itertools.groupby

from itertools import groupby 

data = """0.0 99.13 0.11 
0.5 19.67 0.59 
0.5 22.23 1.22 
1.0 9.67 0.08""".split('\n') 

result = [list(j) for i, j in groupby(data, lambda x: x.split(' ', 1)[0])] 

files_num = 0 
for e in result: 
    files_num = max(files_num, len(e)) 

for i in range(files_num): 
    with open('{}.txt'.format(i), 'w+') as f: 
     for line in result: 
      min_index = min(i, len(line)-1) 
      f.write('{}\n'.format(line[min_index])) 

0.txt:

0.0 99.13 0.11 
0.5 19.67 0.59 
1.0 9.67 0.08 

的1.txt:

0.0 99.13 0.11 
0.5 22.23 1.22 
1.0 9.67 0.08 

否則,如果他們不是爲了進行分組,您可以使用collections.OrderedDict這種方式(如1_CR suggested,但也有一些變化):

from collections import OrderedDict 

data = """0.0 99.13 0.11 
0.5 19.67 0.59 
1.0 9.67 0.08 
0.5 22.23 1.22""".split('\n') 

d = OrderedDict() 
for line in data: 
    split = line.split(' ', 1) 
    d.setdefault(split[0], []).extend(split[1:]) 

print(d) 

輸出:

OrderedDict([ ('0.0', ['99.13 0.11']), 
       ('0.5', ['19.67 0.59', '22.23 1.22']), 
       ('1.0', ['9.67 0.08']) ]) 
+0

我不認爲這就是她要找的 –

+0

你能解釋一下嗎? –

+0

OP從未說過這些值是排序的,如果這些行被混洗,這將失敗。 – Bakuriu

0

另一種選擇

from StringIO import StringIO 
from collections import OrderedDict 
s = '''\ 
0.0 99.13 0.11 
0.5 19.67 0.59 
0.5 22.23 1.22 
1.0 9.67 0.08 
''' 
f = StringIO(s) 
d = OrderedDict() 
for line in f: 
    fields = line.split() 
    d[fields[0]] = fields[1:] 

for key in d: 
    print key, ' '.join(d[key]) 

0.0 99.13 0.11 
0.5 22.23 1.22 
1.0 9.67 0.08