2012-03-03 202 views
3

嗨夥計們我輸入一個文件名.txt併產生多個輸出文件filename1.txt,filename2.txt和filename3.txt。更具體地講這裏是FILENAME.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的數據.TXT應該只生產列時間和頻道的數據3

的源代碼:

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])) 

編譯我得到的文本文件文件名1,文件名2和filename3但只有數據文件名1。 文件名2和文件名3數據發生了什麼變化?

+0

你應該回去接受一些或所有問題的答案。有關更多信息,請參閱meta上的此答案:http://meta.stackexchange.com/a/5235/166957 – 2012-03-06 23:03:50

回答

4

for line in input耗盡了input文件中的所有行。您必須重新加載文件,並在開始時重新開始,如果您想再次瀏覽它們,或者先將它們複製到另一個列表中。

+0

謝謝,剛開始使用Python。愛它比C更好。 – guiNachos 2012-03-03 00:26:58

4

您只讀取一次輸入,但嘗試遍歷所有行三次。您可以打開全部3個輸出並同時寫入所有輸出,或打開輸入3次(每個輸出文件一次)。最好的方法將取決於您的具體要求(文件的大小,輸出文件的數量等)。

開放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 2012-03-03 00:26:28

+0

nope。我的錯誤是,在修改代碼時,我在那裏留下了「j」。答案已更新 – mgibsonbr 2012-03-03 00:30:14

2

只是一個提示。第二with聲明後,加

input.seek(0) 

也可以做的伎倆。

相關問題