0

可能重复:
汇总来自多个文件的列的值

我在这里有一个小问题,我试图总结来自多个文件(50)的条目,每个文件都包含 3 列。例如,使用前 3 个文件:file1.txt、file2.txt、file3.txt,它们看起来像:

文件 1.txt:

2 3 4
1 5 6
5 4 7

文件2.txt:

1 2 1
2 3 2
4 3 1

文件 3.txt:

6 1 1
1 3 0
3 4 5

所以我的问题是我如何总结来自 50 个文件的第一列、第二列和第三列的所有条目,最终得到一个看起来像这样的文件:

输出.txt:

9 6 6
4 11 8
12 11 13

我已经阅读了 50 个文件并附加了它们,但实际上我在逐个汇总条目时遇到了麻烦。

所以我这样做了:

for p in range(50):
    locals()['first_col%d' % p] = []
    locals()['second_col%d' % p] = []
    locals()['third_col%d' % i] = []

for i in range(1,50):
    f = open("file"+str(i)+".txt","r")
    for line in f:
        locals()['fist_col%d' % i].append(float(line.split()[0]))
        locals()['second_col%d' % i].append(float(line.split()[1]))
        locals()['third_col%d' % i].append(float(line.split()[2]))

f.close()

我试图想办法把它放在一个循环中,该循环将读取所有first_colsfirst_col1、、、first_col2first_col3),second_colsthird_cols总结条目。

4

3 回答 3

1

您可以使用glob通配符匹配文件名模式,然后明智地使用zip和滥用literal_eval(可能只想考虑转换为的生成器int) - 注意 - 这需要每个文件的列数和行数相同,否则会发生截断:

from glob import glob
from ast import literal_eval

filenames = glob('/home/jon/file*.txt')
files = [open(filename) for filename in filenames]
for rows in zip(*files):
    nums = [literal_eval(row.replace(' ', ',')) for row in rows]
    print map(sum, zip(*nums))

[9, 6, 6]
[4, 11, 8]
[12, 11, 13]
于 2013-02-05T17:39:50.373 回答
0

这是您的代码片段

try:
    output_matrix=[[0,0,0],[0,0,0],[0,0,0]]
    for i in range (1,51):
        try:        
            f = open("file"+str(i)+".txt","r")
        except IOError, e:
            continue
        if not f:
            continue
        counter=0
        for line in f:
            row=line.split()
            for row_item in range(0,len(row)):
                output_matrix[counter][row_item]=output_matrix[counter][row_item]+int(row[row_item])
            counter=counter+1
    f = open("Output.txt","w")
    for i in range (0,len(output_matrix)):
        for j in range (0,len(output_matrix[i])):
            f.write(str(output_matrix[i][j]) + ' ')
        f.write('\n')
    f.close()
except Exception,e:
    print str(e)
于 2013-02-05T17:31:49.830 回答
0

在使用空值初始化容器后,我有一个对每个文件求和的解决方案:

>>> import os
>>> def sum_files(path):
    result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    for fil in os.listdir(path):
        full_path = os.path.join(path, fil)
        for line_nb, line in enumerate(open(full_path)):
            numbers = line.split()
            for col_nb, nb in enumerate(numbers):
                result[line_nb][col_nb] += int(nb)
    return result

>>> sum_files(path)
[[9, 6, 6], [4, 11, 8], [12, 11, 13]]
于 2013-02-05T17:20:07.943 回答