python利用lxml读写xml格式的文件


Posted in Python onAugust 10, 2017

之前在转换数据集格式的时候需要将json转换到xml文件,用lxml包进行操作非常方便。

1. 写xml文件

a) 用etree和objectify

from lxml import etree, objectify

E = objectify.ElementMaker(annotate=False)
anno_tree = E.annotation(
  E.folder('VOC2014_instance'),
  E.filename("test.jpg"),
  E.source(
    E.database('COCO'),
    E.annotation('COCO'),
    E.image('COCO'),
    E.url("http://test.jpg")
  ),
  E.size(
    E.width(800),
    E.height(600),
    E.depth(3)
  ),
  E.segmented(0),
)

etree.ElementTree(anno_tree).write("text.xml", pretty_print=True)

输出的test.xml文件内容如下:

```

如果需要在anno_tree的基础上加其他标签的话用append即可:

E2 = objectify.ElementMaker(annotate=False)
anno_tree2 = E2.object(
  E.name("person"),
  E.bndbox(
    E.xmin(100),
    E.ymin(200),
    E.xmax(300),
    E.ymax(400)
  ),
  E.difficult(0)
)
anno_tree.append(anno_tree2)

上面的输出就变成了:

<annotation>
 <folder>VOC2014_instance/person</folder>
 <filename>test.jpg</filename>
 <source>
  <database>COCO</database>
  <annotation>COCO</annotation>
  <image>COCO</image>
  <url>http://test.jpg</url>
 </source>
 <size>
  <width>800</width>
  <height>600</height>
  <depth>3</depth>
 </size>
 <segmented>0</segmented>
 <object>
  <name>person</name>
  <bndbox>
   <xmin>100</xmin>
   <ymin>200</ymin>
   <xmax>300</xmax>
   <ymax>400</ymax>
  </bndbox>
  <difficult>0</difficult>
 </object>
</annotation>

b) 用etree和SubElement

annotation = etree.Element("annotation")
etree.SubElement(annotation, "folder").text = "VOC2014_instance"
etree.SubElement(annotation, "filename").text = "test.jpg"
source = etree.SubElement(annotation, "source")
etree.SubElement(source, "database").text = "COCO"
etree.SubElement(source, "annotation").text = "COCO"
etree.SubElement(source, "image").text = "COCO"
etree.SubElement(source, "url").text = "http://test.jpg"
size = etree.SubElement(annotation, "size")
etree.SubElement(size, "width").text ='800' # 必须用string
etree.SubElement(size, "height").text = '600'
etree.SubElement(size, "depth").text = '3'
etree.SubElement(annotation, "segmented").text = '0'
key_object = etree.SubElement(annotation, "object")
etree.SubElement(key_object, "name").text = “person”
bndbox = etree.SubElement(key_object, "bndbox")
etree.SubElement(bndbox, "xmin").text = str(100)
etree.SubElement(bndbox, "ymin").text = str(200)
etree.SubElement(bndbox, "xmax").text = str(300)
etree.SubElement(bndbox, "ymax").text = str(400)
etree.SubElement(key_object, "difficult").text = '0'
doc = etree.ElementTree(annotation)
doc.write(open("test.xml", "w"), pretty_print=True)

2. 读xml

这里可以用xpath直接提取所需的元素的值。比如想要获取上面test.xml文件的x, y坐标:

tree = etree.parse("test.xml")
# get bbox
for bbox in tree.xpath('//bndbox'):  # 获取bndbox元素的内容
  for corner in bbox.getchildren(): # 便利bndbox元素下的子元素
    print corner.text  # string类型

参考

http://lxml.de/tutorial.html

https://stackoverflow.com/questions/12657043/parse-xml-with-lxml-extract-element-value

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写的ARP攻击代码实例
Jun 04 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Python实现查看系统启动项功能示例
May 10 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Python对象转换为json的方法步骤
Apr 25 Python
python实现logistic分类算法代码
Feb 28 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
Mar 12 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 #Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 #Python
Python基础之getpass模块详细介绍
Aug 10 #Python
Python中字典(dict)合并的四种方法总结
Aug 10 #Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 #Python
Python 操作文件的基本方法总结
Aug 10 #Python
Python 模拟登陆的两种实现方法
Aug 10 #Python
You might like
php下使用SMTP发邮件的代码
2008/01/10 PHP
php 远程关机操作的代码
2008/12/05 PHP
php 注释规范
2012/03/29 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
Three.js快速入门教程
2016/09/09 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
js插件Jcrop自定义截取图片功能
2016/10/14 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
windows下python连接oracle数据库
2017/06/07 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
校园摄影活动策划方案
2014/02/05 职场文书
高中毕业自我评价
2014/02/08 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
大学迎新标语
2014/06/26 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
教师思想工作总结2015
2015/05/13 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书