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获取网页状态码示例
Mar 30 Python
简单解析Django框架中的表单验证
Jul 17 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
Python使用OpenCV进行标定
May 08 Python
基于数据归一化以及Python实现方式
Jul 11 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
Python脚本完成post接口测试的实例
Dec 17 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
Django权限控制的使用
Jan 07 Python
python 多线程爬取壁纸网站的示例
Feb 20 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开发注意事项总结
2015/02/04 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
使用js写的一个简易的投票
2013/11/27 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
iframe实用操作锦集
2014/04/22 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
Python实现简单登录验证
2016/04/13 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
Python_LDA实现方法详解
2017/10/25 Python
Php多进程实现代码
2018/05/07 Python
Python 串口读写的实现方法
2019/06/12 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
小学教师培训感言
2014/02/11 职场文书
大学生评语大全
2014/04/18 职场文书
授权委托书
2014/07/31 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
优秀高中学生评语
2014/12/30 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
小学三年级语文教学反思
2016/03/03 职场文书