2010-03-11 91 views
83

文件目前我使用此:閱讀並覆蓋在Python

f = open(filename, 'r+') 
text = f.read() 
text = re.sub('foobar', 'bar', text) 
f.seek(0) 
f.write(text) 
f.close() 

但問題是,舊的文件比新文件較大。所以我最終得到一個新文件,其中包含舊文件的一部分。

回答

142

如果你不想關閉並重新打開該文件,以避免競爭條件,你可以truncate它:

f = open(filename, 'r+') 
text = f.read() 
text = re.sub('foobar', 'bar', text) 
f.seek(0) 
f.write(text) 
f.truncate() 
f.close() 

的功能還可以是cleaner and safer使用with open as每mVChr的評論,這即使發生錯誤,也會關閉處理程序。

with open(filename, 'r+') as f: 
    text = f.read() 
    text = re.sub('foobar', 'bar', text) 
    f.seek(0) 
    f.write(text) 
    f.truncate() 
+9

謝謝,很好的答案。我也想在這裏說明,最好的做法是以'open'(filename,'r +')作爲f:'塊打開文件,這樣它會自動關閉塊末尾的文件,即使有異常。 – mVChr 2015-01-28 16:44:28

14

text = re.sub('foobar', 'bar', text)之後重新打開文件(因此清除舊內容)並將更新後的文本寫入它可能會更容易和更加簡單。

14

fileinput該模塊具有inline模式寫入變爲您正在處理的文件,而無需使用臨時文件等模塊很好地封裝上循環中的文件的列表的行的共同操作,通過一個對象,其透明地保持跟蹤文件名稱,行號等等,如果你想在循環內檢查它們。

import fileinput 
for line in fileinput.FileInput("file",inplace=1): 
    if "foobar" in line: 
     line=line.replace("foobar","bar") 
    print line 
-3

嘗試在新文件中寫入吧..

f = open(filename, 'r+') 
f2= open(filename2,'a+') 
text = f.read() 
text = re.sub('foobar', 'bar', text) 
f.seek(0) 
f.close() 
f2.write(text) 
fw.close()