Python XML转Json之XML2Dict的使用方法


Posted in Python onJanuary 15, 2019

1. Json读写方法

def parseFromFile(self, fname):
  """
  Overwritten to read JSON files.
  """
  f = open(fname, "r")
  return json.load(f)


def serializeToFile(self, fname, annotations):
  """
  Overwritten to write JSON files.
  """
  f = open(fname, "w")
  json.dump(annotations, f, indent=4, separators=(',', ': '), sort_keys=True)
  f.write("\n")

2. xml文件的工具包XML2Dict

将xml转换成Python本地字典对象, 访问子元素和字典常用方法类似,略有不同, 使用 “.”

注: 使用xml2dict库,需要在本地项目添加 xml2dict.py, object_dict.py,下载链接

加载xml文件

from xml2dict import XML2Dict
xml = XML2Dict()
r = xml.parse("待处理文件名.xml")

xml示例[voc2007格式]:

<annotation>
  <folder>VOC2007</folder>
  <filename>AL_00001.JPG</filename>
  <size>
    <width>800</width>
    <height>1160</height>
    <depth>3</depth>
  </size>
  <object>
    <name>l_faster</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>270</xmin>
      <ymin>376</ymin>
      <xmax>352</xmax>
      <ymax>503</ymax>
    </bndbox>
  </object>
  <object>
    <name>l_faster</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>262</xmin>
      <ymin>746</ymin>
      <xmax>355</xmax>
      <ymax>871</ymax>
    </bndbox>
  </object>
  <object>
    <name>r_faster</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>412</xmin>
      <ymin>376</ymin>
      <xmax>494</xmax>
      <ymax>486</ymax>
    </bndbox>
  </object>
  <object>
    <name>r_faster</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>411</xmin>
      <ymin>748</ymin>
      <xmax>493</xmax>
      <ymax>862</ymax>
    </bndbox>
  </object>
</annotation>

分析下这个文件的格式:

最外一层被<annotation></annotation>包围

往里一层是:<file_name></file_name>,<size></size>,<object></object>,其中object是列表,包括name和bndbox,示例访问annotation下级元素

# -*- coding: utf-8 -*-
from xml2dict import XML2Dict
xml = XML2Dict()
r = xml.parse('Annotations/AL_00001.xml')
for item in r.annotation:
  print item
print '------------'
for item in r.annotation.object:
  print item.name, item.bndbox.xmin, item.bndbox.xmax, item.bndbox.ymin, item.bndbox.ymax

执行结果:

object
folder
size
value
filename
------------
l_faster 270 352 376 503
l_faster 262 355 746 871
r_faster 412 494 376 486
r_faster 411 493 748 862

完整代码[xml2json]

# -*- coding: utf-8 -*-
from xml2dict import XML2Dict
import json
import glob


def serializeToFile(fname, annotations):
  """
  Overwritten to write JSON files.
  """
  f = open(fname, "w")
  json.dump(annotations, f, indent=4, separators=(',', ': '), sort_keys=True)
  f.write("\n")

def getAnnos(file_name="", prefix=''):
  xml = XML2Dict()
  root = xml.parse(file_name)
  # get a dict object
  anno = root.annotation
  image_name = anno.filename
  item = {'filename': prefix + image_name, 'class': 'image', 'annotations': []}

  for obj in anno.object:

    cls = {'l_faster': 'C1', 'r_faster': 'C2'}[obj.name]
    box = obj.bndbox
    x, y, width, height = int(box.xmin), int(box.ymin), int(box.xmax) - int(box.xmin), int(box.ymax) - int(box.ymin)
    item['annotations'] += [{
        "class": cls,
        "height": height,
        "width": width,
        "x": x,
        "y": y
      }]
  return item

if __name__ == '__main__':
  annotations = []
  anno_name = 'AR_001-550.json'
  files = glob.glob('Annotations/AR_*.xml')
  files = sorted(files)
  # print files.sort()
  for filename in files:
    item = getAnnos(filename, prefix='TFS/JPEGImages/')
    print item
    print '-----------------'
    annotations += [item] #"xmls/AL_00001.xml"
  serializeToFile(anno_name, annotations)

以上这篇Python XML转Json之XML2Dict的使用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
python中pip的安装与使用教程
Aug 10 Python
python pytest进阶之conftest.py详解
Jun 27 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
python3将变量写入SQL语句的实现方式
Mar 02 Python
python 实现汉诺塔游戏
Nov 28 Python
python 实现定时任务的四种方式
Apr 01 Python
python utc datetime转换为时间戳的方法
Jan 15 #Python
Python模块的加载讲解
Jan 15 #Python
Python实现网站表单提交和模板
Jan 15 #Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 #Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 #Python
Python3中lambda表达式与函数式编程讲解
Jan 14 #Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 #Python
You might like
高亮度显示php源代码
2006/10/09 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
jquery 选择器部分整理
2009/10/28 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
BootStrap中
2016/12/10 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
2018/07/25 jQuery
vue实现拖拽效果
2019/12/23 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
python保留小数位的三种实现方法
2020/01/07 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
C面试题
2015/10/08 面试题
高中生自我评语大全
2014/01/19 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
大型营销活动计划书
2014/04/28 职场文书
资助贫困学生倡议书
2014/05/16 职场文书
节约用水演讲稿
2014/05/21 职场文书
鲁迅故居导游词
2015/02/05 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电