Python заменяет и перезаписывает вместо добавления

У меня есть следующий код:

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" добавляется, т.е. У меня есть старый контент, связанный с новым "замененным" контентом. Что я могу сделать, чтобы удалить старый материал и сохранить только новый?

Ответ 1

Вам нужно 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

Ответ 2

Используя 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()

Ответ 3

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

Откройте файл в режиме 'w', вы сможете заменить его текущий текст, сохранив файл новым содержимым.

Ответ 4

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

У меня была похожая проблема, и вместо того, чтобы перезаписать свой существующий файл, используя различные "режимы", я просто удалил файл, прежде чем использовать его снова, так что это было бы так, как будто я добавлял новый файл при каждом запуске моего кода,

Ответ 5

Вы можете легко сделать это, открыв первый файл как "r" и открыв второй файл как "w". Прочитайте первый файл и запишите его во второй файл. Как это:

with open("Path_To_First_File","r") as root:
    with open("Path_To_Second_File","w") as target:
        target.write(root.read())