2010-03-11 57 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()