替换并覆盖而不是附加
我有以下代码:
import re
#open the xml file for reading:
file = open('path/test.xml','r+')
#convert to string:
data = file.read()
file.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data))
file.close()
我想用新内容替换文件中的旧内容。但是,当我执行代码时,将附加文件“
test.xml”,即,我的旧内容被新的“替换”内容所取代。为了删除旧内容而只保留新内容,我该怎么办?
-
您需要
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