2013-05-30 4 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 
Смежные вопросы