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