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实现的简单文件传输服务器和客户端
Apr 08 Python
Python信息抽取之乱码解决办法
Jun 29 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python实现飞机大战游戏
Oct 26 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
Python Pandas数据分析工具用法实例
Nov 05 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
php查看网页源代码的方法
2015/03/13 PHP
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
Angular的$http与$location
2016/12/26 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
小程序自定义圆形进度条
2020/11/17 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
java中两个byte数组实现合并的示例
2018/05/09 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
代码中finally中的代码会不会执行
2012/02/06 面试题
求职者简历中的自我评价
2013/10/20 职场文书
安全责任书怎么写
2014/07/28 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
企业宣传语大全
2015/07/13 职场文书
python如何正确使用yield
2021/05/21 Python
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android