目前我正在使用这个:
f = open(filename, 'r+') text = f.read() text = re.sub('foobar', 'bar', text) f.seek(0) f.write(text) f.close()
但问题是旧文件比新文件大 . 所以我最终得到一个新文件,其中包含旧文件的一部分 .
fileinput模块具有 inline 模式,用于在不使用临时文件等的情况下将更改写入正在处理的文件 . 模块通过透明地跟踪文件的对象很好地封装了在文件列表中循环的常见操作 . 名称,行号等,如果你想在循环内检查它们 .
inline
import fileinput for line in fileinput.FileInput("file",inplace=1): if "foobar" in line: line=line.replace("foobar","bar") print line
可能在 text = re.sub('foobar', 'bar', text) 之后关闭文件会更容易和更整洁,重新打开它以进行写入(从而清除旧内容),并将更新后的文本写入其中 .
text = re.sub('foobar', 'bar', text)
尝试将其写入新文件中..
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()
如果你不想关闭并重新打开文件,为避免竞争条件,你可以truncate:
f = open(filename, 'r+') text = f.read() text = re.sub('foobar', 'bar', text) f.seek(0) f.write(text) f.truncate() f.close()
使用 with open as 每mVChr的注释功能也可能是cleaner and safer,这将关闭处理程序,即使发生错误也是如此 .
with open as
with open(filename, 'r+') as f: text = f.read() text = re.sub('foobar', 'bar', text) f.seek(0) f.write(text) f.truncate()
4 回答
fileinput模块具有
inline
模式,用于在不使用临时文件等的情况下将更改写入正在处理的文件 . 模块通过透明地跟踪文件的对象很好地封装了在文件列表中循环的常见操作 . 名称,行号等,如果你想在循环内检查它们 .可能在
text = re.sub('foobar', 'bar', text)
之后关闭文件会更容易和更整洁,重新打开它以进行写入(从而清除旧内容),并将更新后的文本写入其中 .尝试将其写入新文件中..
如果你不想关闭并重新打开文件,为避免竞争条件,你可以truncate:
使用
with open as
每mVChr的注释功能也可能是cleaner and safer,这将关闭处理程序,即使发生错误也是如此 .