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/ironpython:从入门到精通
Oct 02 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
使用python爬取B站千万级数据
Jun 08 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
python3判断url链接是否为404的方法
Aug 10 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
Python小进度条显示代码
Mar 05 Python
python学生管理系统学习笔记
Mar 19 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
django实现模型字段动态choice的操作
Apr 01 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 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 pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
2020/09/22 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
企划主管岗位职责
2013/12/12 职场文书
爱情检讨书大全
2014/01/21 职场文书
《中华少年》教学反思
2014/02/15 职场文书
化学工程专业求职信
2014/08/10 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
mysql insert 存在即不插入语法说明
2022/03/25 MySQL