Python XML轉(zhuǎn)Json之XML2Dict的使用方法
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轉(zhuǎn)換成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
執(zhí)行結(jié)果:
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轉(zhuǎn)Json之XML2Dict的使用方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Pandas?count()與values_count()的用法及區(qū)別
這篇文章主要介紹了關(guān)于Pandas?count()與values_count()的用法及區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
python+selenium 點擊單選框-radio的實現(xiàn)方法
今天小編就為大家分享一篇python+selenium 點擊單選框-radio的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
在Tensorflow中實現(xiàn)梯度下降法更新參數(shù)值
今天小編就為大家分享一篇在Tensorflow中實現(xiàn)梯度下降法更新參數(shù)值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python Tornado實現(xiàn)WEB服務(wù)器Socket服務(wù)器共存并實現(xiàn)交互的方法
這篇文章主要介紹了Python Tornado實現(xiàn)WEB服務(wù)器Socket服務(wù)器共存并實現(xiàn)交互的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

