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实现简单ftp客户端的方法
Jun 28 Python
Python 40行代码实现人脸识别功能
Apr 02 Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 Python
python issubclass 和 isinstance函数
Jul 25 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
python如何用matplotlib创建三维图表
Jan 26 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 Python
Python pygame实现中国象棋单机版源码
Jun 20 Python
python字符串的一些常见实用操作
Apr 06 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中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
Python深入学习之装饰器
2014/08/31 Python
Python代码调试的几种方法总结
2015/04/15 Python
使用python实现生成用户信息
2017/03/20 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
python模块导入的细节详解
2018/12/10 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
python如何代码集体右移
2020/07/20 Python
Python 绘制可视化折线图
2020/07/22 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
linux面试相关问题
2012/08/11 面试题
大学生毕业自我评价范文分享
2013/11/07 职场文书
新春寄语大全
2014/04/09 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
护士找工作求职信
2014/07/02 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
信息技术国培研修日志
2015/11/13 职场文书
python四种出行路线规划的实现
2021/06/23 Python