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根据距离和时长计算配速示例
Feb 16 Python
Python实现对PPT文件进行截图操作的方法
Apr 28 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
django缓存配置的几种方法详解
Jul 16 Python
python实现Zabbix-API监控
Sep 17 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
Python虚拟环境venv用法详解
May 25 Python
python中xlutils库用法浅析
Dec 29 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中常用数组处理方法实例分析
2008/08/30 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
iframe 异步加载技术及性能分析
2011/07/19 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
js+css实现打字效果
2020/06/24 Javascript
搭建vue开发环境
2018/07/19 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
python实现中文文本分句的例子
2019/07/15 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
经典c++面试题四
2015/05/14 面试题
servlet面试题
2012/08/20 面试题
求职信需要的五点内容
2014/02/01 职场文书
运动会邀请函范文
2014/02/06 职场文书
医学生个人求职信范文
2014/02/07 职场文书
绿色学校实施方案
2014/03/31 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
2016新年致辞
2015/08/01 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
vue使用watch监听属性变化
2022/04/30 Vue.js