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