2012-03-03 20 views
3

こんにちは私はfilename.txtを入力し、複数の出力ファイルfilename1.txt、filename2.txt、およびfilename3.txtを生成しています。ここでは具体的には、ファイル名.txtで入力されたデータである:テキストファイルを入力し、Pythonで複数の出力ファイルを書き込む

Time(ms) Channel 1 Channel 2 Channel 3 
0.0  4.5  3.6  125 
1.0  3.0  3.4  98 
2.0  100  3.0  59 
3.0  23   45.9  2.1 
4.0  34   123  35 
5.0  2.1  222  98 

filename1.txtは、時間とチャンネル1 filename2.txtは列だけの時間とチャンネル2 filename3をのデータを生成する必要がありますだけの列のデータを生成する必要があります私は、テキストファイルファイル名1、ファイル名2及びfilename3をしかし、ファイル名1のデータのみを取得するコンパイル

with open('filename.txt', 'r') as input: 
    for i in range(1,4): 
     with open('filename%i.txt' %i, 'w') as output: 
      for line in input: 
       columns = line.strip().split() 
       for j in range(1,4): 
        output.write('{:10}{:10}\n'.format(columns[0], columns[j+1])) 

:.TXTは列だけの時間とチャンネル3

ソースコードのデータを生成する必要があります。 filename2とfilename3のデータはどうなりましたか?

+0

あなたは戻って、あなたの質問のいくつかまたはすべての回答を受け入れるべきです。詳細については、この回答を参照してください。http://meta.stackexchange.com/a/5235/166957 –

答えて

4

for line in inputは、inputファイルのすべての行を使い果たします。ファイルを再読み込みし、最初から別のリストにコピーする場合は、ファイルを再読み込みして最初からやり直す必要があります。

+0

ありがとう、ちょうどPythonから始まります。おかげさまで、Cよりも愛しています。 – guiNachos

4

入力を1回だけ読み込み、すべての行を3回反復しようとしました。 3つの出力をすべて開いて、それらのすべてに同時に書き込むことも、入力を3回開くこともできます(出力ファイルごとに1回)。最適な方法は、特定の要件(ファイルのサイズ、出力ファイルの数など)によって異なります。

オープニング3回はクリーンなコードを生成しますが、それはあまり効率的であるかもしれない:

for i in range(1,4): 
    with open('filename.txt', 'r') as input: 
     with open('filename%i.txt' %i, 'w') as output: 
      for line in input: 
       columns = line.strip().split() 
       output.write('{:10}{:10}\n'.format(columns[0], columns[i])) 

with句なし良いだろう、一度にすべての出力ファイルを開くための一般的な解決策:

files = [open('filename%i.txt' %i, 'w') for i in range(1,4)] 
with open('filename.txt', 'r') as input: 
    for line in input: 
     columns = line.strip().split() 
     for j in range(1,4): 
      files[j-1].write('{:10}{:10}\n'.format(columns[0], columns[j])) 
for f in files: 
    f.close() 

(この場合は手動でも例外を処理する必要があります)

+0

ありがとうございました。私はちょうど一度だけ読んでいるが、三度書いていることに気づいた。 "j"変数には何らかの意味がありますか? – guiNachos

+0

nope。私の間違いは、あなたのコードを変更するときに私はそこに "j"を残しました。回答を更新しました – mgibsonbr

2

ちょうどいいです。 2番目のwithステートメントの後に、

input.seek(0) 

もトリックを行うことができます。

関連する問題