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 相关文章推荐
Windows下安装python2和python3多版本教程
Mar 30 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python爬取微信公众号文章
Aug 31 Python
Python 处理图片像素点的实例
Jan 08 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
Django REST framework视图的用法
Jan 16 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
Pytorch之Variable的用法
Dec 31 Python
python实现双色球随机选号
Jan 01 Python
Django自带的用户验证系统实现
Dec 18 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 上传文件的方法(类)
2009/07/30 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
python发腾讯微博代码分享
2014/01/10 Python
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python 实现敏感词过滤的方法
2019/01/21 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
python动态进度条的实现代码
2019/07/03 Python
python中adb有什么功能
2020/06/07 Python
Python脚本调试工具安装过程
2021/01/11 Python
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
人事主管岗位职责范本
2013/12/04 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
JavaScript 对象创建的3种方法
2021/11/17 Javascript