如何在python中更新/修改XML文件?
我有一个XML文档,我想在它已经包含数据后更新它 我考虑在如何在python中更新/修改XML文件?,python,xml,io,Python,Xml,Io,我有一个XML文档,我想在它已经包含数据后更新它 我考虑在“a”(append)模式下打开XML文件。问题是新数据将写入根结束标记之后 如何删除文件的最后一行,然后从该点开始写入数据,然后关闭根标记 当然,我可以读取整个文件并进行一些字符串操作,但我认为这不是最好的主意 谢谢您的时间。您真正想做的是使用XML解析器并使用提供的API附加新元素 然后简单地覆盖文件 最容易使用的可能是如下所示的DOM解析器: 您应该使用特定的XML模块读取XML文件。这样,您就可以在内存中编辑XML文档,并将更改后
“a”
(append)模式下打开XML文件。问题是新数据将写入根结束标记之后
如何删除文件的最后一行,然后从该点开始写入数据,然后关闭根标记
当然,我可以读取整个文件并进行一些字符串操作,但我认为这不是最好的主意
谢谢您的时间。您真正想做的是使用XML解析器并使用提供的API附加新元素 然后简单地覆盖文件 最容易使用的可能是如下所示的DOM解析器:
您应该使用特定的XML模块读取XML文件。这样,您就可以在内存中编辑XML文档,并将更改后的XML文档重写到文件中 以下是一个快速开始:
还有很多其他的XML实用程序,哪一个是最好的取决于XML文件的性质以及您希望以何种方式编辑它。虽然我同意Tim和Oben Sonne的观点,您应该使用XML库,但仍有一些方法可以将其作为简单的字符串对象进行操作 我可能不会尝试对您所描述的内容使用单个文件指针,而是将文件读入内存,编辑它,然后写出它:
inFile = open('file.xml', 'r')
data = inFile.readlines()
inFile.close()
# some manipulation on `data`
outFile = open('file.xml', 'w')
outFile.writelines(data)
outFile.close()
快速简便的方法是使用
readlines()
将整个文件读入字符串列表,这绝对是不应该做的(见下文)。我写这篇文章的目的是为了方便快捷的解决方案
只需使用open()
打开文件,然后调用readlines()
方法。您将得到文件中所有字符串的列表。现在,您可以轻松地在最后一个元素之前添加字符串(只需在最后一个元素之前添加一个元素即可)。最后,您可以使用writelines()
将它们写回文件
举个例子可能会有所帮助:
my_file = open(filename, "r")
lines_of_file = my_file.readlines()
lines_of_file.insert(-1, "This line is added one before the last line")
my_file.writelines(lines_of_file)
您不应该这样做的原因是,除非您正在做一些非常快速而肮脏的事情,否则您应该使用XML解析器。这是一个允许您使用DOM、树和节点等概念智能地使用XML的库。这不仅是处理XML的正确方法,也是标准方法,使您的代码更具可移植性,也更易于其他程序员理解
Tim的回答提到为此目的签出,我认为这是一个好主意。有用的Python XML解析器:
用你选择的XML解析器打开你的文件,找到你感兴趣的节点,替换这个值,将文件序列化。 使这个过程更健壮,你可以考虑使用SAX解析器(这样你就不必把整个文件保存在内存中),读写到树的末尾,然后开始追加。使用
ElementTree
:
import xml.etree.ElementTree
# Open original file
et = xml.etree.ElementTree.parse('file.xml')
# Append new tag: <a x='1' y='abc'>body text</a>
new_tag = xml.etree.ElementTree.SubElement(et.getroot(), 'a')
new_tag.text = 'body text'
new_tag.attrib['x'] = '1' # must be str; cannot be an int
new_tag.attrib['y'] = 'abc'
# Write back to file
#et.write('file.xml')
et.write('file_new.xml')
import xml.etree.ElementTree
#打开原始文件
et=xml.etree.ElementTree.parse('file.xml')
#附加新标记:正文文本
new_tag=xml.etree.ElementTree.SubElement(et.getroot(),'a')
new_tag.text='body text'
new_tag.attrib['x']='1'#必须是str;不能是整数
新标签.attrib['y']='abc'
#写回文件
#et.write('file.xml')
et.write('file_new.xml')
注意:输出写入文件\u new.xml
供您实验,回写文件.xml
将替换旧内容
要点:ElementTree库将属性存储在dict中,因此,这些属性在xml文本中列出的顺序将不会保留。相反,它们将按字母顺序输出。
(同时,评论也被删除。我觉得这很烦人)
ie:xml输入文本some body
将作为some body
输出(按字母顺序排列后,定义了顺序参数)
这意味着,当将原始文件和更改的文件提交到修订控制系统(如SVN、CSV、ClearCase等)时,这两个文件之间的差异可能看起来不太明显。正如Edan Maor所解释的,快速而肮脏的方法(对于[utc-16]编码的.xml文件),对于Edam Maor所解释的原因,您不应该这样做,如果时间限制不允许您学习(propper)XML解析,可以使用以下python 2.7代码完成 假设您想:
pattern = '<Author>'
subst = ' <Author>' + domain + '\\' + user_name + '</Author>'
line_index =0 #set line count to 0 before starting
file = io.open('a/b.xml', 'r', encoding='utf-16')
lines = file.readlines()
outFile = open('a/c.xml', 'w')
for line in lines[0:len(lines)]:
line_index =line_index +1
if line_index == len(lines):
#1. & 2. delete last line and adding another line in its place not writing it
outFile.writelines("Write extra line here" + '\n')
# 4. Close root tag:
outFile.writelines("</phonebook>") # as in:
#http://tizag.com/xmlTutorial/xmldocument.php
else:
#3. Substitue a line if it finds the following substring in a line:
pattern = '<Author>'
subst = ' <Author>' + domain + '\\' + user_name + '</Author>'
if pattern in line:
line = subst
print line
outFile.writelines(line)#just writing/copying all the lines from the original xml except for the last.
pattern=''
subst=''+域+'\'+用户名+''
line_index=0#启动前将line count设置为0
file=io.open('a/b.xml','r',encoding='utf-16')
lines=file.readlines()
outFile=open('a/c.xml','w')
对于行中的行[0:len(行)]:
行索引=行索引+1
如果行_索引==len(行):
#1. & 2. 删除最后一行并在其位置添加另一行,而不是写入它
outFile.writelines(“在此处额外写入一行”+'\n')
# 4. 关闭根标记:
outFile.writelines(“”)如:
#http://tizag.com/xmlTutorial/xmldocument.php
其他:
#3.如果在一行中发现以下替换字符串,则替换该行:
模式=“”
subst=''+域+'\'+用户名+''
如果模式一致:
行=子行
打印行
outFi
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
for rank in root.iter('rank'):
new_rank = int(rank.text) + 1
rank.text = str(new_rank)
tree.write('output.xml')