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爬虫常用的模块分析
Aug 29 Python
python继承和抽象类的实现方法
Jan 14 Python
浅谈python socket函数中,send与sendall的区别与使用方法
May 09 Python
Python自定义简单图轴简单实例
Jan 08 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
python处理RSTP视频流过程解析
Jan 11 Python
基于python实现上传文件到OSS代码实例
May 09 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
Python eval函数介绍及用法
Nov 09 Python
使用python实现学生信息管理系统
Feb 25 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读取和编写XML DOM的实现代码
2011/02/03 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
php注册登录系统简化版
2020/12/28 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
javascript中动态函数用法实例分析
2015/05/14 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
python基础教程之序列详解
2014/08/29 Python
Python and、or以及and-or语法总结
2015/04/14 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
python 重定向获取真实url的方法
2018/05/11 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
python实现三壶谜题的示例详解
2020/11/02 Python
安全生产一岗双责责任书
2014/07/28 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python