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 相关文章推荐
以windows service方式运行Python程序的方法
Jun 03 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
名片管理系统python版
Jan 11 Python
Python模拟随机游走图形效果示例
Feb 06 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
详解python做UI界面的方法
Feb 27 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
python中正则表达式的使用详解
2014/10/17 Python
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
python下载图片实现方法(超简单)
2017/07/21 Python
scrapy爬虫完整实例
2018/01/25 Python
python写一个md5解密器示例
2018/02/23 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
国际经济贸易专业推荐信
2013/11/06 职场文书
运动会入场词50字
2014/02/20 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
公司委托书怎么写
2014/08/02 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
自我推荐信格式模板
2015/03/24 职场文书