python文件处理:解析.xml文件
来源:互联网 发布:lte中mr优化案例 编辑:程序博客网 时间:2024/06/06 18:00
XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性。
在做目标检测手工标注数据集的时候,通常会把标注的目标位置信息写入一个.xml文件,但在检查数据和数据清洗的时候,面对一堆坐标数据很难对标注的准确性进行检查,所以通常需要对xml文件进行解析,读出其中保存的目标和目标的一些信息。
需要解析的xml文件如下
<annotation> <folder>Images</folder> <filename>00001</filename> <path>E:\Images\00001.jpg</path> <source> <database>Unknown</database> </source> <size> <width>432</width> <height>495</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>mirror</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>3</xmin> <ymin>159</ymin> <xmax>52</xmax> <ymax>202</ymax> </bndbox> </object> <object> <name>mirror</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>370</xmin> <ymin>134</ymin> <xmax>427</xmax> <ymax>179</ymax> </bndbox> </object> <object> <name>glass</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>56</xmin> <ymin>102</ymin> <xmax>373</xmax> <ymax>224</ymax> </bndbox> </object> <object> <name>light</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>29</xmin> <ymin>325</ymin> <xmax>114</xmax> <ymax>389</ymax> </bndbox> </object> <object> <name>light</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>322</xmin> <ymin>305</ymin> <xmax>405</xmax> <ymax>372</ymax> </bndbox> </object></annotation>
Ok ,从结构上,它很像我们常见的HTML超文本标记语言。但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观。它被设计用来传输和存储数据,其焦点是数据的内容。
那么它有如下特征:
首先,它是有标签对组成: <aa></aa>
标签可以有属性:<aa id=’123’></aa>
标签对可以嵌入数据:<aa>abc</aa>
标签可以嵌入子标签(具有层级关系):
<aa> <bb></bb></aa>
上面的xml文件保存了目标的名字:name和四个坐标(xmin, ymin, xmax, ymax),使用python对其进行解析。
#coding=utf-8import xml.dom.minidom#打开xml文档dom = xml.dom.minidom.parse('abc.xml')#得到文档元素对象root = dom.documentElementprint root.nodeNameprint root.nodeValueprint root.nodeTypeprint root.ELEMENT_NODE
mxl.dom.minidom 模块被用来处理xml文件,所以要先引入。
xml.dom.minidom.parse() 用于打开一个xml文件,并将这个文件对象dom变量。
documentElement 用于得到dom对象的文档元素,并把获得的对象给root
每一个结点都有它的nodeName,nodeValue,nodeType属性。
nodeName为结点名字。
nodeValue是结点的值,只对文本结点有效。
nodeType是结点的类型。catalog是ELEMENT_NODE类型
现在有以下几种:
‘ATTRIBUTE_NODE’
‘CDATA_SECTION_NODE’
‘COMMENT_NODE’
‘DOCUMENT_FRAGMENT_NODE’
‘DOCUMENT_NODE’
‘DOCUMENT_TYPE_NODE’
‘ELEMENT_NODE’
‘ENTITY_NODE’
‘ENTITY_REFERENCE_NODE’
‘NOTATION_NODE’
‘PROCESSING_INSTRUCTION_NODE’
‘TEXT_NODE’
NodeTypes - 有名常数
对于上文列出的xml文件,笔者使用了如下脚本,供读者进行参考,可根据自己的需要修改。
#! /usr/bin/env python#coding = utf-8from xml.dom.minidom import parseimport xml.dom.minidomfrom PIL import Image, ImageDrawimport osimport ImageFontxml_path = '/Users/Lee/Desktop/check_xml/experiments/xml/'filelists = os.listdir(xml_path)filelists.pop(0)img_path = '/Users/Lee/Desktop/check_xml/experiments/images/'save_path = '/Users/Lee/Desktop/check_xml/experiments/check_img/'num = 0for file in filelists: xml_file_path = os.path.join(xml_path+file) DOMTree = xml.dom.minidom.parse(xml_file_path) Data = DOMTree.documentElement img_name_tmp = Data.getElementsByTagName("filename") img_name = img_name_tmp[0].childNodes[0].data Objects = Data.getElementsByTagName("object") xmin_1 = [] ymin_1 = [] xmax_1 = [] ymax_1 = [] name_1 = [] for object in Objects: name = object.getElementsByTagName('name')[0] name_1.append(name.childNodes[0].data) xmin = object.getElementsByTagName('xmin')[0] xmin_1.append(int(xmin.childNodes[0].data)) ymin = object.getElementsByTagName('ymin')[0] ymin_1.append(int(ymin.childNodes[0].data)) xmax = object.getElementsByTagName('xmax')[0] xmax_1.append(int(xmax.childNodes[0].data)) ymax = object.getElementsByTagName('ymax')[0] ymax_1.append(int(ymax.childNodes[0].data)) img = Image.open(os.path.join(img_path+img_name+'.jpg')) num_object = len(name_1) for i in range(num_object): x_text = (xmax_1[i] - xmin_1[i]) * 0.15 + xmin_1[i] y_text = ymin_1[i] - 25 draw_name = ImageDraw.Draw(img) font1 = ImageFont.truetype("times_New_Roman.ttf",24) draw_name.text((x_text, y_text), name_1[i], fill= (255,0,0), font = font1) draw_rect = ImageDraw.Draw(img) draw_rect.rectangle([(xmin_1[i], ymin_1[i]), (xmax_1[i], ymax_1[i])],outline=(255,0,0)) img.save(os.path.join(save_path + img_name + '.jpg')) num = num + 1 if num % 500 == 0: print num
上述脚本可以把xml保存的名字和位置信息在原图上反映出来,用以检查手工标注数据的准确性。
- python文件处理:解析.xml文件
- Python解析XML文件
- python 解析xml文件
- python解析xml文件
- Python 解析XML文件
- Python解析XML文件
- Python解析XML文件
- Python 解析XML文件
- python解析XML文件
- Python 解析xml文件
- Python xml文件解析
- python解析xml文件
- python解析xml文件
- Python: XML文件解析
- python处理xml文件
- python处理XML文件
- python 处理xml文件
- Python处理xml文件
- 欢迎使用CSDN-markdown编辑器
- WIN+*组合键失效.解决办法.
- C++基础积累(1)using namespace potter 自定义命名空间和使用
- JSON.parse()和JSON.stringify()
- [BZOJ3837][Pa2013][随机][乱搞]Filary
- python文件处理:解析.xml文件
- JAVA类C++指针使用
- LEETCODE 45. Jump Game II
- IDOC的处理函数IDOC_INPUT_ORDERS的增强点的分析
- Android 使用极光/友盟推送,APP进程杀死后为什么收不到推送
- Android实现倒计时功能
- 给ProgressBar 设置圆形进度条颜色
- Xposed入门浅析
- oracle dead lock