0

重複の可能性:
複数のファイルの列の値を合計する

ここで小さな問題があります。複数のファイル(50)からのエントリを合計しようとしていますが、それぞれに3つの列が含まれています。たとえば、最初の3つのファイルを使用します:file1.txt、file2.txt、file3.txtは次のようになります。

file1.txt:

2 3 4
1 5 6
5 4 7

file2.txt:

1 2 1
2 3 2
4 3 1

file3.txt:

6 1 1
1 3 0
3 4 5

だから私の質問は、50個のファイルの1列目、2列目、3列目のすべてのエントリを合計して、次のようなファイルにする方法です。

output.txt:

9 6 6
4 11 8
12 11 13

50個のファイルを読み込んで追加しましたが、実際にエントリを1つずつ合計するのに問題があります。

だから私はこれをしました:

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_cols考えfirst_col1ています。first_col2first_col3second_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

null値でコンテナを初期化した後、ファイルごとにファイルを合計するソリューションがあります。

>>> 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 に答える
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 に答える