常用的数据集voc的标签格式是xml,看看xml的读写方法吧。
我是从以下几个网站进行学习的:
Python XML解析
python 读取xml
Python使用ElementTree解析XML
python有三种方法解析XML,SAX,DOM,以及ElementTree:
.SAX (simple API for XML )
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
2.DOM(Document Object Model)
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
3.ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
xml.etree.ElementTree 模块对含有恶意代码的数据是不安全的。如果你想处理不信任的数据请使用 XML vulnerabilities。
每个element都有一系列相关属性:
- 标签,用于标识该元素表示哪种数据(即元素类型)
- 一些属性,存储在Python dictionary中
- 一个文本字符串
- 一个可选的尾字符串
- 一些孩子elements,存储在Python sequence中
xml的解析
使用下面的xml为例:
<data>
<country name="Liechtenstein">
"countryText"
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
对于xml文件而言可以使用
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
对于内存中的字符串可以使用:
root = ET.fromstring(country_data_as_string)
ElementTree的解析,会将文件转化为树状结构,每一个节点是一个Element,一个Element中可能包含多个子Element。
获取了根结点之后,有两种获取字节点的方法。
第一种是:
for child in root:
print(child.tag, child.attrib,child.text)
其中child.tag为属性名称,比如country, child.attrib为对应属性中所包含的字段,比如name="Liechtenstein",类型为dict(字典),child.text为属性中所包含的文本信息,比如 "countryText"。
第二种是:
root.findall('country')
root.find('country'):
child.get("name")
其中Element.findall() 查找当前element的孩子的属于某个tag的element。 Element.find() 查找属于某个tag的第一个element, Element.text 访问element的文本内容。 Element.get()获取element的属性,也就是child.attrib对应的value。当然因为可能包含多个element,所以你使用的时候需要提供key。
xml的修改
#修改默认属性
child.text='new field'
#添加新的element
child.se('updated', 'yes')
xml的保存
# 保存修改了的xml
import xml.etree.ElementTree as ET
tree = ET.parse('myTest.xml')
root = tree.getroot()
print(len(root))
for child in root:
child.text = 'new Field'
tree.write('final.xml')