用Python读取和覆盖文件

目前我正在使用这个:

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

但问题是旧文件比新文件大。 所以我最终得到一个新的文件,在它的最后有一个旧文件的一部分。

如果您不想closures并重新打开文件,为了避免竞争条件,可以truncate它:

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

根据mVChr的注释,该function也可以更清洁和更安全 ,即使发生错误,也会closures处理程序。

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

可能在text = re.sub('foobar', 'bar', text)后closures文件会更容易,更方便,重新打开文件进行写入(从而清除旧内容),然后将更新后的文本写入文件。

文件fileinput模块有一个inline模式,用于在不使用临时文件等的情况下将更改写入正在处理的文件。该模块很好地封装了在文件列表中循环行的通用操作,通过透明地跟踪文件的对象名称,行号等,如果你想检查他们在循环内。

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

尝试写入一个新的文件

 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()