Python将文件中的类似行分组到一行

时间:2012-03-16 04:52:16

标签: python file sorting

我目前有一个非常无序的文件

file.txt

vfc1 3435 4556
vfc1 2334 2123
vfc1 5556 1234
vfc2 8997 5969
vfc2 4543 3343
vfc2 1232 2123

我想要做的是订购此文件,以便我文件中的所有行显示在一行上,如下所示:

file_output.txt
vfc1 1234 2123 2334 3435 4556 5556 
vfc2 1232 2123 3343 4543 5969 8997 

5 个答案:

答案 0 :(得分:2)

这个怎么样?

from collections import defaultdict

d = defaultdict(list)
with open('input.txt') as f:
    for line in f.readlines():
        data = line.split()
        d[data[0]].extend(data[1:])

with open('output.txt', 'w') as f:
    for key, value in d.iteritems():
        f.write(
            '%(key)s %(value)s\n' 
            % {'key': key, 'value': " ".join(sorted(value))}
        )

答案 1 :(得分:1)

也许是这样的:

d = {}

for line in file('file.txt'):
        if line.strip():
                sl = line.split()
                if d.has_key(sl[0]):
                        d[sl[0]] += ' %s' % ' '.join(sl[1:])
                else:
                        d[sl[0]] = ' '.join(sl[1:])

fd = open('file_output.txt', 'w')
for key in d:
        fd.write('%s %s\n' % (key, d[key]))

fd.close()

答案 2 :(得分:0)

不是特定于python的。更像是伪代码,但这里的想法是:

  • 获取数组中的所有行
  • 设置目标数组
  • 设置“最后一个条目”数组
  • 设置全局变量以确定当前索引
  • 浏览数组:
    • 使用' '(空格)作为分隔符将字符串拆分为数组parts
    • parts[0] == currentIndex?如果是,请将parts[1],parts[2]添加到lastEntry
    • 如果不是,请将lastEntry添加到targetArray。设置currentIndex = parts[0]。清除lastEntry。将parts[1],parts[2]添加到lastEntry

就是这样! : - )

答案 3 :(得分:0)

my_file = open('file.txt', 'r')

lines = {}

for line in my_file:
    values = line.split()
    lines[values[0]] = lines.get(values[0], []) + values[1:]

my_file.close()
new_file = open('output_file.txt', 'w')

for k in lines:
    line = '%s %s\n' % (k, ' '.join(sorted(lines[k])))
    new_file.write(line)

new_file.close()

答案 4 :(得分:0)

您还可以使用iterools.groupby按第一列对行进行分组:

from collections import defaultdict
from itertools import chain, groupby

with open(input) as f:
    data = (x.split() for x in f)
    grouped = defaultdict(list)
    for key, group in groupby(data, key=lambda x: x[0]):
        for line in group:
            grouped[key] += line[1:]

for k,v in grouped.items():
    print k, ' '.join(v)