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入门篇之字典
Oct 17 Python
Python中Random和Math模块学习笔记
May 18 Python
详解Python中映射类型(字典)操作符的概念和使用
Aug 19 Python
Python实现的凯撒密码算法示例
Apr 12 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 Python
python random从集合中随机选择元素的方法
Jan 23 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
python用for循环求和的方法总结
Jul 08 Python
django实现支付宝支付实例讲解
Oct 17 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
php使用PDO获取结果集的方法
2017/02/16 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
BOM与DOM的区别分析
2010/10/26 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
管道维修工岗位职责
2013/12/27 职场文书
文体活动总结范文
2014/05/05 职场文书
关于保护环境的建议书
2014/05/13 职场文书
根叔历年演讲稿
2014/05/20 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
MySQL新手入门进阶语句汇总
2022/09/23 MySQL