Python替换和覆盖而不是追加

时间:2012-07-13 11:04:20

标签: python replace

我有以下代码:

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”,即我将旧的内容与新的“替换”内容相对应。我该怎么做才能删除旧的东西而只保留新内容?

6 个答案:

答案 0 :(得分:55)

如果您想进行替换,则需要使用truncate:https://docs.python.org/3/library/os.html?highlight=truncate#os.truncate 或者您使用open(myfile, 'w')。这将删除旧文件并创建一个新文件。

AFAIK truncate不会更改inode,但open(...,'w')将创建一个新的inode。但在大多数情况下,这并不重要。 ......我现在测试了。 open(...,'w')和truncate()都不会更改文件的inode编号。 (测试两次:一次使用Ubuntu 12.04 NFS,一次使用ext4)。

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

答案 1 :(得分:8)

使用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()

答案 2 :(得分:3)

file='path/test.xml' 
with open(file, 'w') as filetowrite:
    filetowrite.write('new content')
    filetowrite.close()

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

How to Replace String in File进行查看很简单,并且是与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()

答案 5 :(得分: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))