1. Json读写方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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文件
1
2
3
|
from xml2dict import XML2Dict xml = XML2Dict() r = xml.parse( "待处理文件名.xml" ) |
xml示例[voc2007格式]:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
<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下级元素
1
2
3
4
5
6
7
8
9
|
# -*- 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 |
执行结果:
1
2
3
4
5
6
7
8
9
10
|
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]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# -*- 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的使用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u010472607/article/details/77684917