2014-03-19 176 views
1

我是python的新手,並試圖逐行讀取文件,並在每行末尾附加一個字。 「打印行」表示所需的單詞已附加,但沒有根據需要將相同的內容寫回文件。感謝你的幫助。逐行讀取文件並追加字

#!/usr/bin/python 
f=open('test1', 'r+') 
for line in f: 
    line=line.strip("\n") 
    line=line +" " + 'test2' 
    print line 
    f.write(line) 
f.close() 

回答

1

一般來說,讀/同時寫一個文件是一個非常可怕的困難的事情得到的權利。通常,您將從一個文件中讀取數據並寫入其他文件(可能位於內存中)。在內存中的執行將是這樣的:

with open('test1', 'r') as fin: 
    lines = [line.strip('\n') + ' test2\n' for line in fin] 
with open('test1', 'w') as fout: 
    fout.writelines(lines) 

請注意,我在第一with塊讀取文件的所有數據到內存中。在第二個with塊中,我將所有這些數據寫回到一個新文件中(該文件的名稱與舊文件的名稱相同,有效覆蓋舊文件)。當然,如果內存有問題,您可以讀取一行,然後將一行寫入新文件(使用不同的名稱)。關閉並刷新兩個文件後,可以使用shutil.move重命名新文件,以便覆蓋舊文件。

+0

非常感謝您的支持團隊 – user3436288

1

mgilson的代碼有點不對。更正:

with open("test1", "r") as f: 
    new_contents = [line.strip() + "test2" for line in f.readlines()] 
with open("test1", "w") as f: 
    f.write("\n".join(new_contents)) 
+0

啊是的。我說'線',我的意思是'鰭'。傻我。一般來說,直接迭代文件對象肯定比'f.readlines()'好。此外,你的答案忘記追加新行。也許是''\ n'.join(...)'? – mgilson

+0

readlines()讀取'\ n's,如果額外的字符串被附加在前面,那很好。然而,將它附加在後面將它附加到'\ n'後面,導致'original \ nextra'。似乎解決方法是先按照你的建議去除'\ n'和\ n'.join。 – tys

1

@mgilson的答案是非常好,只是一個小錯誤是在lines = [line.strip('\n') + ' test2\n' for line in lines]到底lines應該fin

+0

謝謝,我糾正了。將來,請將其作爲我對答案的評論發佈。我會收到通知,以便我知道我需要儘快解決它。 – mgilson

+0

我想首先在您的回答中添加評論,但我沒有足夠的聲望來做到這一點。 – zbtong

1

mgilson給出的代碼非常棒!但是,如果您同時讀取和追加,則您請求的功能是不可能的。

我太新了python。 因此,我發現自己更舒適的語法如下。

# read in 
f = open('test1', 'r') 
newlines = [] 
for line in f: 
    newline = line.strip("\n") + " " + 'test2' + "\n" 
    newlines.append(newline) 
    print newline, 
f.close() 
# overwrite the same file 
f = open('test1', 'w') 
f.writelines(newlines) 
f.close()