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数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
Python使用微信SDK实现的微信支付功能示例
Jun 30 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
Python判断有效的数独算法示例
Feb 23 Python
python批量处理txt文件的实例代码
Jan 13 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
python库sklearn常用操作
Aug 23 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无限分类源码分享(思路不错)
2011/10/13 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
javascript通过class来获取元素实现代码
2013/02/20 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
Python开发的实用计算器完整实例
2017/05/10 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
Python使用Matlab命令过程解析
2020/06/04 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
房产代理公证处委托书
2014/04/04 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
庆六一活动总结
2014/08/29 职场文书
员工辞职信范文
2015/03/02 职场文书
情感电台广播稿
2015/08/18 职场文书
MySQL窗口函数的具体使用
2021/11/17 MySQL