132

我有以下代码:

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”,即我有旧内容后跟新的“替换”内容。我该怎么做才能删除旧的东西,只保留新的?

4

6 回答 6

147

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

于 2012-07-13T11:10:38.190 回答
102
file='path/test.xml' 
with open(file, 'w') as filetowrite:
    filetowrite.write('new content')

以“w”模式打开文件,您将能够用新内容替换其当前文本保存文件。

于 2018-12-04T07:38:55.270 回答
19

使用truncate(),解决方案可能是

import re
#open the xml file for reading:
with open('path/test.xml','r+') as f:
    #convert to string:
    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()
于 2017-05-23T14:40:44.657 回答
2
import os#must import this library
if os.path.exists('TwitterDB.csv'):
        os.remove('TwitterDB.csv') #this deletes the file
else:
        print("The file does not exist")#add this to prevent errors

我有一个类似的问题,而不是使用不同的“模式”覆盖我现有的文件,我只是在再次使用它之前删除了该文件,这样就好像我在每次运行我的代码时都附加到一个新文件.

于 2019-01-11T09:33:40.320 回答
1

请参阅如何在文件中替换字符串以一种简单的方式工作,并且是一个适用于的答案replace

fin = open("data.txt", "rt")
fout = open("out.txt", "wt")

for line in fin:
    fout.write(line.replace('pyton', 'python'))

fin.close()
fout.close()
于 2020-01-06T15:32:21.510 回答
0

使用 python3 pathlib库:

import re
from pathlib import Path
import shutil

shutil.copy2("/tmp/test.xml", "/tmp/test.xml.bak") # create backup
filepath = Path("/tmp/test.xml")
content = filepath.read_text()
filepath.write_text(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", content))

使用不同方法进行备份的类似方法:

from pathlib import Path

filepath = Path("/tmp/test.xml")
filepath.rename(filepath.with_suffix('.bak')) # different approach to backups
content = filepath.read_text()
filepath.write_text(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", content))
于 2020-08-03T13:08:38.090 回答