2017-09-28 16 views
0

我有一個文本文件。我想用python v3.6逐行讀取文本文件,每行添加一個子字符串,並用附加字符串逐行替換現有行。我的代碼一行一行地讀取和替換python文本文件有什麼問題?

爲了更清楚,這裏是原始文本文件;

1,2,3 
4,5,6 

所需的輸出文本文件應該如下所示;

appended_text,1,2,3 
appended_text,4,5,6 

這是我的代碼看起來像;

with open(filename, 'r+') as myfile: 
    for line in myfile: 
     newline = "appended_text" + "," + line    
     myfile.write(newline) 

我沒有得到我想要的。我得到的是在文件末尾添加了一大段文字。代碼應該如何修改?有沒有更好的方式來實現我想要的?

+1

謝謝@SiHa尋找重複的問題。 – alexis

+2

PS。最好的解決方案可能是'fileinput'模塊,請參閱鏈接問題中的* second *答案。 – alexis

回答

4

在文件中沒有「替換現有行」這樣的事情。對於你想要做的事情,你必須編寫一個帶有修改內容的新文件,然後用新文件替換舊文件。示例代碼:

with open("old.file") as old, open("new.file", "w") as new: 
    for line in old:   
     line = modify(line.lstrip()) 
     new.write(line + "\n") 
os.rename("new.file", "old.file") 
+0

@chepner thx爲s/move/rename/fix;) –

-1

我相信得到你想要的東西,你需要把myfile.readlines()放在你的for循環之前。

+1

你有沒有試過你的「解決方案」? –

+0

是的,我有。事實上,Kleo G已經以更清晰的方式證實了我的答案。 –

+2

他沒有證實。 op正在逐行讀取文件。 –

2

通常,您不能像這樣修改文件。而應將副本寫入新文件,然後用新文件替換原件。

with open(filename, 'r') as myfile: 
    with open("copy", 'w') as newfile: 
     for line in myfile: 
      newline = "appended_text" + "," + line    
      newfile.write(newline) 

os.rename("copy", filename) 
+0

實際上這應該是被接受的答案。 –

+0

呃,我們基本上有同樣的答案。在寫入之前用戶對'newline'做的事情並不是非常重要。 – chepner

1

這裏是我會做什麼:

with open(filename, 'r+') as f: 
    lines = [] 
    for line in f: 
     lines.append("appended_text" + "," + line) 
    f.seek(0) 
    for line in lines: 
     f.write(line) 

例如:

sample.txt的前

hello 
there 
world 

代碼:

fp = r"C:\Users\Me\Desktop\sample.txt" 
with open(fp, 'r+') as f: 
    lines = [] 
    for line in f: 
     lines.append("something," + line) 
     lines.append(line.strip() + ",something\n") 
    f.seek(0) 
    for line in lines: 
     f.write(line) 

爲sample.txt後:

something,hello 
hello,something 
something,there 
there,something 
something,world 
world,something 

有兩點要注意:

  1. 這是假設你要追加到每行的前面。因此換行符('\n')與每行的原始內容保持一致。如果您追加到最後,我會更改爲:lines.append(line.strip() + "," + "appended_text")
  2. 您可能可以結合"appended_text"",""appended_text,"。除非"appended_text"是像appended_text = "something"這樣的可投資者。
  3. 雖然內容正確,可以解決您的問題;我希望能夠編寫一個新的文件,並根據需要進行更改,並用新文件替換舊文件,作爲其他答案中的建議。
+1

這不安全。如果在寫入過程中發生錯誤,您可能會收到損壞的文件。最好確保*整個*文件可以先安全地寫入,然後在一次原子移動中用新的文件替換舊文件。 – chepner

+0

@chepner會遇到什麼錯誤?在容器中迭代和存儲值,尋找和覆蓋與在讀取和使用「w」模式截斷後打開相同的文件沒有區別。 – pstatix

+0

沒錯;他們*都*不安全。根據定義,IO錯誤幾乎不可預測;您不想冒險覆蓋原始文件,直到新文件完全*寫入。 – chepner

1

如果你想將其寫入到同一個文件:

f = open(filename, 'r') 
lines = f.readlines() 
f.close() 

lines = ['appended_text, ' + l for l in lines] 

f = open(filename, 'w') 
f.writelines(lines) 
f.close() 
+1

這與bruno desthuilltiers和我正在做的事情本質上是一樣的,但是首先要將整個原始文件讀入內存。 – chepner

+0

(如果發生任何寫入錯誤,您可能會部分覆蓋原始文件。) – chepner

+0

@MrPyCharm嘗試在100Go文件上運行此操作;) –

相關問題