xml_以字典形式返回xml文件中的标注信息

传入:存储 xml 的根路径

返回:一个 xml 文件中的标注存储为一条字典记录,返回出入根路径中所有 xml 标记的数据信息

 1 import os
 2 import xml.dom.minidom
 3 
 4 ### 传入存储 xml 文件的根路径 --> 以字典的形式返回 xml 文件中存储的数据信息,一个 xml 文件构成一条字典记录
 5 def xml_label_names(xml_root_path):
 6     xml_files = os.listdir(xml_root_path)
 7     # print(xml_root_path, ' 路径下有文件个数:', len(xml_files))
 8     xml_dict_list = []
 9     for xml_file in xml_files:
10         xml_path = os.path.join(xml_root_path, xml_file)
11         # 打开xml文档
12         DOMTree = xml.dom.minidom.parse(xml_path)
13         # 得到文档元素对象
14         collection = DOMTree.documentElement
15 
16         ### 获取文件夹名和文件名
17         folder_name = collection.getElementsByTagName("folder")[0].childNodes[0].data
18         filename = collection.getElementsByTagName("filename")[0].childNodes[0].data
19         # print('\n', 'folder_name: {}  ,filename {}'.format(folder_name, filename))
20 
21         ### 获取 xml 标记中的 size 信息
22         size_list = collection.getElementsByTagName("size")
23         size_depth = size_list[0].getElementsByTagName('depth')[0].childNodes[0].data
24         size_width = size_list[0].getElementsByTagName('width')[0].childNodes[0].data
25         size_height = size_list[0].getElementsByTagName('height')[0].childNodes[0].data
26         # print('size 部分:  depth: {} ,\t {} ,\theight: {}'.format(size_depth, size_width, size_height))
27 
28         ### 得到标签名为object的信息
29         objectlist = collection.getElementsByTagName("object")
30         bbox_list = []
31         for objects in objectlist:
32             ### 获得标记框的标签名,每个 object 中得到子标签名为 name 的信息
33             bndbox_label = objects.getElementsByTagName('name')[0].childNodes[0].data
34             if bndbox_label == 'D00':
35                 bndbox_label = 'D01'
36                 # print('标签名原为 D00 , 现改为 D01')
37             elif bndbox_label == 'D01':
38                 bndbox_label = 'D00'
39                 # print('标签名原为 D01 , 现改为 D00')
40             elif bndbox_label == 'D10':
41                 bndbox_label = 'D11'
42                 # print('标签名原为 D10 , 现改为 D11')
43             elif bndbox_label == 'D11':
44                 bndbox_label = 'D10'
45                 # print('标签名原为 D11 , 现改为 D10')
46             ### 获取标记框的标记信息, 每个 bndbox 中只有一组标记框信息
47             bndbox = objects.getElementsByTagName('bndbox')
48             xmin = int(bndbox[0].getElementsByTagName('xmin')[0].childNodes[0].data)
49             ymin = int(bndbox[0].getElementsByTagName('ymin')[0].childNodes[0].data)
50             xmax = int(bndbox[0].getElementsByTagName('xmax')[0].childNodes[0].data)
51             ymax = int(bndbox[0].getElementsByTagName('ymax')[0].childNodes[0].data)
52             bbox = [xmin, ymin, xmax, ymax]
53             bbox_list.append([bndbox_label, bbox])
54             # print('标签名 {}, \t标签名类型 {}, \t标记框 {}'.format(bndbox_label, type(bndbox_label), bbox))
55 
56         ### 向字典中添加数据
57         xml_dict = {'folder_name':folder_name,
58                     'filename':filename,
59                     'size_depth':size_depth, 'size_width':size_width, 'size_height':size_height,
60                     'objects':bbox_list}
61         # print(xml_dict)
62         xml_dict_list.append(xml_dict)
63     return xml_dict_list
64 
65 
66 xml_root_path = '../data/xml'   # 存储 xml 的根路径
67 xml_dict_list = xml_label_names(xml_root_path)  # 传入 xml 的根路径,显示 xml 中所有的数据信息
68 for i, xml_dict in enumerate(xml_dict_list):
69     print('{:<4d} {}'.format(i, xml_dict))

运行结果如下:

1 0    {'folder_name': 'images', 'filename': 'Czech_003467.jpg', 'size_depth': '3', 'size_width': '600', 'size_height': '600', 'objects': [['D01', [348, 459, 392, 528]], ['D11', [212, 452, 273, 471]], ['D01', [66, 467, 113, 517]], ['D01', [128, 437, 183, 508]]]}
2 1    {'folder_name': 'images', 'filename': 'Czech_003510.jpg', 'size_depth': '3', 'size_width': '600', 'size_height': '600', 'objects': [['D11', [1, 466, 171, 485]], ['D11', [1, 446, 171, 465]], ['D40', [135, 408, 201, 436]]]}
原文地址:https://www.cnblogs.com/lyj0123/p/15682300.html