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连接mysql并提交mysql事务示例
Mar 05 Python
Python中list初始化方法示例
Sep 18 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python 异常处理的实例详解
Sep 11 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
pandas 小数位数 精度的处理方法
Jun 09 Python
Python实现的txt文件去重功能示例
Jul 07 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
python:接口间数据传递与调用方法
Dec 17 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
Python Celery多队列配置代码实例
Nov 22 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 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 获取页面中指定内容的实现类
2014/01/23 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
新手简单了解vue
2019/05/29 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
说出数据连接池的工作机制是什么?
2013/04/19 面试题
法院先进个人事迹材料
2014/05/04 职场文书
员工年终自我评价
2014/09/14 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
银行授权委托书格式
2014/10/10 职场文书
三八妇女节寄语
2015/02/27 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang