Answers:
如果您不想关闭并重新打开文件,为避免出现竞争情况,可以truncate
这样做:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
该功能将很可能也更清洁和更安全的使用open
作为一个上下文管理器,这将关闭该文件处理程序,即使出现错误!
with open(filename, 'r+') as f:
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.write(text)
之前f.truncate()
;它写入第text
一个,因此在.write()
文件光标位于的末尾之后text
。继续截断文件将删除此点之后文件可能剩余的所有字节。在这种情况下,最终结果将与您在写入之前被截断一样。
fileinput
模块可以成为首选方法。传递后inplace=1
,它将首先将文件移动到临时位置,然后将新文件写入旧文件名路径。在UNIX文件系统上,此移动操作很快,因为它仅移动文件系统inode
,而不是全部内容。然后,您可以单独读取和处理每一行,以避免内存过大。:-)
老实说,您可以看一下我构建的该类,它执行基本的文件操作。write方法将覆盖并追加保留旧数据。
class IO:
def read(self, filename):
toRead = open(filename, "rb")
out = toRead.read()
toRead.close()
return out
def write(self, filename, data):
toWrite = open(filename, "wb")
out = toWrite.write(data)
toWrite.close()
def append(self, filename, data):
append = self.read(filename)
self.write(filename, append+data)
f.write(text)
在后面f.truncate()
吗?