替换并覆盖而不是附加

发布于 2021-01-29 18:12:08

我有以下代码:

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”,即,我的旧内容被新的“替换”内容所取代。为了删除旧内容而只保留新内容,我该怎么办?

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您需要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))
    

    无论是truncateopen(..., 'w')将改变inode的文件的数量(我测试过两次,一次是与Ubuntu
    12.04 NFS和曾经与EXT4)。

    顺便说一句,这与Python并没有真正的关系。解释器调用相应的低级API。该方法truncate()在C编程语言中的工作原理相同:请参见http://man7.org/linux/man-
    pages/man2/truncate.2.html



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看