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 自动化将markdown文件转成html文件的方法
Sep 23 Python
python中装饰器级连的使用方法示例
Sep 29 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
Apr 22 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
Python中and和or如何使用
May 28 Python
详解Python 循环嵌套
Jul 09 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 Python
详解Python魔法方法之描述符类
May 26 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 创建标签云函数代码
2010/05/26 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
php批量删除操作代码分享
2017/02/26 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
python中正则表达式的使用详解
2014/10/17 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
工程造价与管理专业应届生求职信
2013/11/23 职场文书
廉洁自律承诺书
2014/03/27 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python