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使用win32com实现的模拟浏览器功能示例
Jul 13 Python
神经网络python源码分享
Dec 15 Python
详解Django解决ajax跨域访问问题
Aug 24 Python
python列表使用实现名字管理系统
Jan 30 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
Form表单及django的form表单的补充
Jul 25 Python
关于Python中定制类的比较运算实例
Dec 19 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
如何理解Python中包的引入
May 29 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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
模仿OSO的论坛(二)
2006/10/09 PHP
MySQL中create table语句的基本语法是
2007/01/15 PHP
php自动适应范围的分页代码
2008/08/05 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
javascript不同页面传值的改进版
2008/09/30 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
python实现代码统计程序
2019/09/19 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
浅谈python出错时traceback的解读
2020/07/15 Python
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
厨师岗位职责
2013/11/12 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
技术比武方案
2014/05/19 职场文书
市场推广策划方案
2014/06/02 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
春节慰问简报
2015/07/21 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
利用Pycharm连接服务器的全过程记录
2021/07/01 Python
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python