您需要seek
在写入之前到文件的开头,然后file.truncate()
如果要进行就地替换,请使用:
import re
myfile = "path/test.xml"
with open(myfile, "r+") as f:
data = f.read()
f.seek(0)
f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>", r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", data))
f.truncate()
另一种方法是读取文件,然后再次打开它open(myfile, 'w')
:
with open(myfile, "r") as f:
data = f.read()
with open(myfile, "w") as f:
f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>", r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", data))
也truncate
不会open(..., 'w')
更改文件的inode编号(我测试了两次,一次使用 Ubuntu 12.04 NFS,一次使用 ext4)。
顺便说一句,这与 Python 并没有真正的关系。解释器调用相应的低级 API。该方法truncate()
在 C 编程语言中的工作方式相同:参见http://man7.org/linux/man-pages/man2/truncate.2.html