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 NLP入门教程
Dec 25 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
flask session组件的使用示例
Dec 25 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
python树的同构学习笔记
Sep 14 Python
基于python判断目录或者文件代码实例
Nov 29 Python
Python: 传递列表副本方式
Dec 19 Python
python with (as)语句实例详解
Feb 04 Python
python可以用哪些数据库
Jun 22 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
pycharm Tab键设置成4个空格的操作
Feb 26 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中计算字符串相似度的函数代码
2012/12/29 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
xml和web特殊字符
2009/04/28 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
python能开发游戏吗
2020/06/11 Python
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
《二泉映月》教学反思
2014/04/15 职场文书
村庄环境整治方案
2014/05/15 职场文书
公司会议策划方案
2014/05/17 职场文书
五一促销活动总结
2014/07/01 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
甲午大海战观后感
2015/06/02 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
Redis数据同步之redis shake的实现方法
2022/04/21 Redis