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中bisect模块用法实例
Sep 25 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
python爬取网页转换为PDF文件
Jun 07 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
python 随机生成10位数密码的实现代码
Jun 27 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
python批量修改xml属性的实现方式
Mar 05 Python
python如何保存文本文件
Jun 07 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 数据库树的遍历方法
2009/02/06 PHP
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
Angular2 多级注入器详解及实例
2016/10/30 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
python调用fortran模块
2016/04/08 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
超市5.1促销活动
2014/01/15 职场文书
工作分析计划书
2014/04/30 职场文书
企业委托书范本
2014/09/13 职场文书
机关职员工作检讨书
2014/10/23 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
hive数据仓库新增字段方法
2022/06/25 数据库