【TensorFlow】Python解析xml文件
最近在项目中使用TensorFlow训练目标检测模型,在制作自己的数据集时使用了labelimg软件对图片进行标注,产生了VOC格式的数据,但标注生成的xml文件标签值难免会产生个别错误造成程序无法跑通,或后期有修改xml中标签值的需求,所以得使用Python代码对xml文件进行解析操作,当然也是参考了各种博客,故在此总结一下。
1. xml文件格式
由labelimg标注生成的xml文件格式如下所示,
<annotation>
<folder>images1</folder>
<filename>0.png</filename>
<path>C:\Users\White\Desktop\images1\0.png</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>1080</width>
<height>1920</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>box</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>345</xmin>
<ymin>673</ymin>
<xmax>475</xmax>
<ymax>825</ymax>
</bndbox>
</object>
<object>
<name>box</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>609</xmin>
<ymin>1095</ymin>
<xmax>759</xmax>
<ymax>1253</ymax>
</bndbox>
</object>
</annotation>
xml是可扩展标记语言,主要用来标记数据和定义数据类型,从结构上看,有以下特点:
只有一个根结点,其中结点中可以有属性;
一个结点由标签对组成,如<folder></folder>;
结点的标签对可以有属性,如<object id = 0></object>;
标签对中可以存储数据,如<object id = 0>123</object>;
结点可以相互嵌套,形成子结点,如<object id = 0> <name>box</name></object>;
2.xml.dom解析xml
文件对象模型(Document Object Model,简称DOM),dom在解析xml文件时一次性将整个文档加载至内存,在内存中使用树结构来保存xml文件中的标签元素和结构,同时你可以使用dom中的函数来解析获取文件信息或修改保存信息,以下为使用dom统计某个文件夹下xml文件中每类标签数量的Python代码,
#coding:utf-8
import os.path
import xml.dom.minidom class_nums = {"box": 0, "person": 0}
n = 0
xmldir = "E:\\Project\\object\\merged_xml" for xmlfile in os.listdir(xmldir):
print(xmlfile)
# 打开xml文件
dom = xml.dom.minidom.parse(os.path.join(xmldir, xmlfile))
# 获得元素对象
root = dom.documentElement
name_length = len(root.getElementsByTagName('name'))
# 获取标签对name之间的值
for i in range(name_length):
key = str(root.getElementsByTagName('name')[i].firstChild.data)
#print(key)
if key in class_nums.keys():
class_nums[key] += 1
# print('node', root.getElementsByTagName('filename')[0].firstChild.data)
# print('node', filename.firstChild.data)
n += 1
print('processed file number is ', n)
for key in class_nums:
print(key, ':', class_nums[key])
1. 导入Python中的xml.dom文件解析模块
import xml.dom.minidom
2. 获取dom对象和结点:xml.dom.minidom是Python用于处理xml文件的模块,其具有函数xml.dom.minidom.parse()
dom = xml.dom.minidom.parse(os.path.join(xmldir, xmlfile))
该函数传入xml文件的路径和文件名的字符串,用于打开一个xml文件,并得到dom文档树,并通过documentElement得到根结点,
root = dom.documentElement
name_length = len(root.getElementsByTagName('name'))
如果我们知道结点的名称,可以通过root.getElementsByTagName(' ')来获得所有名称等于传入字符串的结点,并可以通过索引来获得相同名称的不同结点,如下所示,
name0 = root.getElementsByTagName('name')[0]
name1 = root.getElementsByTagName('name')[1]
4. 获取标签对之间的数据:firstChild 属性返回被选节点的第一个子节点,.data表示获取该节点的数据。
key = str(root.getElementsByTagName('name')[i].firstChild.data)
5. 补充:获取标签的属性值getAttribute(),以前面的<object id = 0>123</object>为例,
objectlist = root.getElementsByTagName('object')
object0 = objectlist[0]
id0=object0.getAttribute("id")
3.xml.etree.ElementTree解析xml
ElementTree也是处理xml文件的模块,其具有两种类型,python实现型的xml.etree.ElementTree和c语言实现型的xml.etree.cElementTree,后者比前者的速度更快,内存消耗更少。以下为将xml文件转换为CSV文件的代码示例,
#coding:utf-8
import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET def xml_to_csv(path):
xml_list = []
for xml_file in glob.glob(path + '/*.xml'):
#返回解析树
tree = ET.parse(xml_file)
#获取根节点
root = tree.getroot()
# print(root)
# 根据标签名查找root下的所有标签,并获取其值
print(root.find('filename').text)
#对所有目标进行解析
for member in root.findall('object'):
value = (root.find('filename').text,
int(root.find('size')[0].text), #width
int(root.find('size')[1].text), #height
member[0].text, #object name
int(member[4][0].text), #xmin
int(float(member[4][1].text)), #ymin
int(member[4][2].text), #xmax
int(member[4][3].text) #ymax
)
xml_list.append(value)
column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
#pandas创建带列名的二维数据表
xml_df = pd.DataFrame(xml_list, columns=column_name)
return xml_df
1.首先导入解析模块,
import xml.etree.ElementTree as ET
2. 返回解析树和获取根节点,
#返回解析树
tree = ET.parse(xml_file)
#获取根节点
root = tree.getroot()
3. 可以通过根节点root可以遍历下一层的节点,.tag和.attrib可以获取标签名和标签属性,.text获取标签中的值,
for rootChild in root:
print( 'tagname:', rootChild.tag, 'attribute:', rootChild.attrib, 'value:', rootChild.text)
4. 可以使用下标访问各层节点,
int(member[4][0].text), #xmin
int(float(member[4][1].text)), #ymin
5. 使用findall()查找所有相同标签名的标签,
#根据标签名查找root下的所有标签
objectList = root.findall("object")
6.通过set和get来修改标签属性名,
object0 = root.findall('object')[0]
id = object0.get('id')
object0.set('id', 111)
id2 = object0.get('id')
print (id, id2)
4. 其他解析方式
还可以通过xml.sax模块来解析xml,但前两者已经足够应付大部分需求,在这里就不展开介绍了。
【TensorFlow】Python解析xml文件的更多相关文章
- python 解析xml 文件: Element Tree 方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- python 解析xml 文件: DOM 方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- python 解析xml 文件: SAX方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- 遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件
XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...
- Python 解析 XML 文件生成 HTML
XML文件result.xml,内容如下: <ccm> <metric> <complexity>1</complexity> <unit> ...
- Python解析xml文件遇到的编码解析的问题
使用python对xml文件进行解析的时候,假设xml文件的头文件是utf-8格式的编码,那么解析是ok的,但假设是其它格式将会出现例如以下异常: xml.parsers.expat.ExpatErr ...
- [转载] python 解析xml 文件: SAX方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- python解析xml文件时使用ElementTree和cElementTree的不同点;iter
在python中,解析xml文件时,会选用ElementTree或者cElementTree,那么两者有什么不同呢? 1.cElementTree速度上要比ElementTree快,比较cElemen ...
- python 解析 XML文件
如下使用xml.etree.ElementTree模块来解析XML文件.ElementTree模块中提供了两个类用来完成这个目的: ElementTree表示整个XML文件(一个树形结构) Eleme ...
随机推荐
- 使用spring cache和ehcache
一.spring cache Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该 ...
- 北京联通IPTV 数码视讯 Q1 破解过程
1. 买个usb转ttl的线,我买的是ch340g,3.8元包邮,店家貌似叫telesky,不重要,买到这货就行,里面有送杜邦线 2. 电脑上安装ch340g驱动,注意不要安装错了,注意电压的设置保持 ...
- 并发库应用之三 & 线程池与定时器应用
在TCP服务器编程模型的原理,每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程.如果访问服务器的客户端很多,那么服务器 ...
- 在MySQL或者SQLServer中,添加对象后自动返回主键到对象模型中的配置方式
设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中.MySQL和SQLServer执行auto-generated key fiel ...
- java 锁的分类
java中为了解决多线程并发带来的线程安全问题,引入了锁机制. 一.公平锁和非公平锁 1.公平锁:按照申请锁的顺序(FIFO队列)来获取锁. 2.非公平锁:所有线程都会竞争,获取的锁的顺序和申请顺序无 ...
- 算法进阶之Leetcode刷题记录
目录 引言 题目 1.两数之和 题目 解题笔记 7.反转整数 题目 解题笔记 9.回文数 题目 解题笔记 13.罗马数字转整数 题目 解题笔记 14.最长公共前缀 题目 解题笔记 20.有效的括号 题 ...
- [NOI1999] 棋盘分割
COGS 100. [NOI1999] 棋盘分割 http://www.cogs.pro/cogs/problem/problem.php?pid=100 ★★ 输入文件:division.in ...
- linux 系统下IntelliJ IDEA的安装及使用
由于刚刚进入研究生阶段,通过几个月对大数据的学习,从java到hadoop,再到scala到spark.在这我写一下我在ubuntu系统下intelliJ IDEA的安装和配置.首先我的ubuntu系 ...
- R爬虫实战1(学习)—基于RVEST包
这里用Hadley Wickham开发的rvest包.再次给这位矜矜业业开发各种好用的R包的大神奉上膝盖. 查阅资料如下: rvest的github rvest自身的帮助文档 rvest + CSS ...
- 20155233 2016-2017-2 《Java程序设计》第7周学习总结
20155233 2016-2017-2 <Java程序设计>第7周学习总结 学习目标 了解Lambda语法 了解方法引用 了解Fucntional与Stream API 掌握Date与C ...