2

ここに目を向けてくれてありがとう。

数百のテキスト ファイル (1.txt、2.txt、3.txt ...) の形式のスペクトル データを処理していますが、これらはすべて次のようにまったく同じ行数でフォーマットされています。 :

1.txt:             2.txt:            3.txt:
1,5                1,4               1,7
2,8                2,9               2,14
3,10               3,2               3,5
4,13               4,17              4,9
<...>              <...>             <...>
4096,1             4096,7            4096,18

私はそれらを行ごとに連結しようとしているので、次のような1つの出力ファイルで立ち去ります:

5,4,7
8,9,14
10,2,5
13,17,9
<...>
1,7,18

私はPythonを初めて使用します。ここで助けていただければ幸いです。私はこの混乱を試みました:

howmanyfiles=8
output=open('output.txt','w+')
for j in range(howmanyfiles):
    fp=open(str(j+1) + '.txt','r')
    if j==0:
        for i, line in enumerate(fp):
            splitline=line.split(",")
            output.write(splitline[1])
    else:
        output.close()
        output=open('output.txt','r+')
        for i, line in enumerate(fp):
            splitline=line.split(",")
            output.write(output.readline(i)[:-1]+","+splitline[1])
    fp.close()
output.close()

上記の私の考え方は、各ファイルのドキュメントの先頭にカーソルを戻す必要があるということです..しかし、それは本当に私の顔に吹き飛ばされています.

心から感謝します。

-マット

4

2 に答える 2

1

組み込み関数から多くのマイレージを取得できると思います。zipこれにより、すべての入力ファイルを同時に反復処理できます。

from contextlib import ExitStack

num_files = 8
with open("output.txt", "w") as output, ExitStack() as stack:
    files = [stack.enter_context(open("{}.txt".format(i+1)))
             for i in range(num_files)]
    for lines in zip(*files): # lines is a tuple with one line from each file
        new_line = ",".join(line.partition(',')[2] for line in lines) + "\n"
        file.write(new_line)
于 2013-05-16T05:32:33.127 に答える
0

ジェネレーターでそれを行う楽しい方法は次のとおりです。

import sys

files     = sys.argv[1:]
handles   = (open(f) for f in files)
readers   = ((line.strip() for line in h) for h in handles)
splitters = ((line.split(',')[1] for line in r) for r in readers)
joiners   = (",".join(tuple(s)) for s in splitters)

for j in joiners:
    print j

Unixの貼り付けコマンドも調べてください。

于 2013-05-16T03:27:56.657 に答える