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

通常,每次我的文件的第一列中有重复值时,我想创建一个文件,其中只有一个重复值和所选行的值。

到目前为止,我的代码是:

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']

这会让我玩索引 - 也许检查 column[0] 是否重复然后打印该行?还是创建字典会更容易?

干杯,凯特

4

2 回答 2

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 建议的,但有一些更改):

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']) ])
于 2013-05-30T11:47:41.463 回答
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
于 2013-05-30T13:29:09.017 回答