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调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
Python中Django框架利用url来控制登录的方法
Jul 25 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
python实现内存监控系统
Mar 07 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python使用递归的方式建立二叉树
Jul 03 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
python中元组的用法整理
Jun 15 Python
Python pymysql模块安装并操作过程解析
Oct 13 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使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
vue实现扫码功能
2020/01/17 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
通过python实现随机交换礼物程序详解
2019/07/10 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
struct和class的区别
2015/11/20 面试题
机械制造专业个人的自我评价
2013/12/28 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
表彰先进的通报
2014/01/31 职场文书
音乐教学随笔感言
2014/02/19 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
SQL Server内存机制浅探
2022/04/06 SQL Server