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 相关文章推荐
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
用Python实现KNN分类算法
Dec 22 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
python按比例随机切分数据的实现
Jul 11 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
关于python中plt.hist参数的使用详解
Nov 28 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
python分分钟绘制精美地图海报
Feb 15 Python
pytorch中的 .view()函数的用法介绍
Mar 17 Python
python单向链表实例详解
May 25 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读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
详解Python的Django框架中的通用视图
2015/05/04 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python游戏地图最短路径求解
2019/01/16 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Python识别处理照片中的条形码
2020/11/16 Python
经理秘书找工作求职信
2013/12/19 职场文书
小学教师事迹材料
2014/01/13 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫