2012-06-25 157 views
14
text_file = open("new.txt", "r") 

lines = text_file.readlines() 

for line in lines: 
     var1, var2 = line.split(","); 
     myfile = open('xyz.txt', 'w') 
     myfile.writelines(var1) 
     myfile.close() 
text_file.close() 

我在new.txt中有10行像Adam:8154 George:5234等等。現在我想要一個只包含名稱的文本文件。 xyz.txt必須包含Adam George等。現在上面的代碼只給我第十個名字。在for循環中寫入文件

如何在單個文本文件中包含所有10個名稱。

回答

21

那是因爲你打開,寫和關閉文件10次你在for循環

myfile = open('xyz.txt', 'w') 
myfile.writelines(var1) 
myfile.close() 

您應該打開和關閉以外的文件進行循環。

myfile = open('xyz.txt', 'w') 
for line in lines: 
    var1, var2 = line.split(","); 
    myfile.write("%s\n" % var1) 

myfile.close() 
text_file.close() 

也應注意使用寫不writelines

writelines將行列表寫入您的文件。

此外,你應該看看這裏使用with聲明的人發佈的答案。這是在Python中執行文件讀/寫操作的優雅方法

+1

或者使用'with'。 –

+0

它沒有對結果做任何改變 – h4r5h4

+0

是的,想先讓他理解這個問題。謝謝 – pyfunc

11

主要問題是您在循環中反覆打開/關閉文件。

試試這個辦法:

with open('new.txt') as text_file, open('xyz.txt', 'w') as myfile: 
    for line in text_file: 
     var1, var2 = line.split(","); 
     myfile.write(var1+'\n') 

我們一次打開這兩個文件,因爲我們使用的with他們將是,當我們完成(或發生異常)自動關閉。以前,您的輸出文件在循環中重複打開。

我們也在逐行處理文件,而不是一次性讀取全部到內存中(這可能是您處理真正大文件時的一個問題)。

注意write()不追加換行符('\n'),所以你必須自己做,如果你需要它(我write()取代你writelines()因爲你正在編寫一個項目,而不是項目的列表) 。

當打開一個文件r讀取時,'r'是可選的,因爲它是默認模式。

+0

非常感謝 – h4r5h4

+0

@Levon:+1感謝您的更正 – pyfunc

5

這是最好使用上下文管理者循環之前自動關閉文件

with open("new.txt", "r"), open('xyz.txt', 'w') as textfile, myfile: 
for line in textfile: 
    var1, var2 = line.split(","); 
    myfile.writelines(var1) 
+0

我知道你可以用'with'打開多個文件(我也是這樣做),但是我不知道這個格式的文件變量在最後學到了新東西,整齊。 – Levon