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