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使用正则表达式检测密码强度源码分享
Jun 11 Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 Python
Python如何实现动态数组
Nov 02 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
python实现图片插入文字
Nov 26 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
keras 读取多标签图像数据方式
Jun 12 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
分析Python list操作为什么会错误
Nov 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和MySql来与ODBC数据连接
2006/10/09 PHP
第十节--抽象方法和抽象类
2006/11/16 PHP
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
详细讲解JS节点知识
2010/01/31 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
AngularJS快速入门
2015/04/02 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
python django事务transaction源码分析详解
2017/03/17 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
自荐书范文范例
2014/02/13 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
小学语文复习计划
2015/01/19 职场文书
学校施工安全责任书
2015/01/29 职场文书
体育个人工作总结
2015/02/09 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
超市食品安全承诺书
2015/04/29 职场文书
无保留意见审计报告
2015/06/05 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
mysql知识点整理
2021/04/05 MySQL
Python竟然能剪辑视频
2021/05/25 Python