You need seek
to the beginning of the file before writing and then use file.truncate()
if you want to do inplace replace:
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()
The other way is to read the file then open it again with 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))
Neither truncate
nor open(..., 'w')
will change the inode number of the file (I tested twice, once with Ubuntu 12.04 NFS and once with ext4).
By the way, this is not really related to Python. The interpreter calls the corresponding low level API. The method truncate()
works the same in the C programming language: See http://man7.org/linux/man-pages/man2/truncate.2.html
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…