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中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python实现包含min函数的栈
Apr 29 Python
python sys.argv[]用法实例详解
May 25 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
基于python指定包的安装路径方法
Oct 27 Python
python async with和async for的使用
Jun 20 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
Python猴子补丁知识点总结
Jan 05 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
用python实现监控视频人数统计
May 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
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
php 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
2016/01/08 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python使用OpenCV进行标定
2018/05/08 Python
python取余运算符知识点详解
2019/06/27 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
python变量的作用域是什么
2020/05/26 Python
Python Selenium库的基本使用教程
2021/01/04 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
职务说明书范文
2014/05/07 职场文书
授权委托书协议书
2014/10/16 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
2016小学新学期寄语
2015/12/04 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书