Python基础知识之读取XML文件

        如果你是深度学习的一员,那么平时在训练模型的时候,就会常看到一些标注是使用xml文件来做的,比如常用到的一个数据集VOC,它的Annotations就是用xml来储存图片中对象的属性的。
所以对于熟悉读取xml文件是很有必要的,我们先来看个xml文件,来自VOC2012的对2007_000027.jpg图片里面对象属性的标注,2007_000027.xml


	VOC2012
	2007_000027.jpg
	
		The VOC2007 Database
		PASCAL VOC2007
		flickr
	
	
		486
		500
		3
	
	0
	
		person
		Unspecified
		0
		0
		
			174
			101
			349
			351
		
		
			head
			
				169
				104
				209
				146
			
		
		
			hand
			
				278
				210
				297
				233
			
		
		
			foot
			
				273
				333
				297
				354
			
		
		
			foot
			
				319
				307
				340
				326
			
		
	

那如何来读取里面的节点与它的内容呢,这里需要使用到xml.etree.ElementTree这样的一个库

import xml.etree.ElementTree as ET
tree=ET.parse('2007_000027.xml')

通过parse解析文件,生成一个树的对象,然后在这个对象里面去寻找节点即可
比如这里,我们想要读取图片的宽和高节点的属性值,也就是节点size里面的width与height,通过tree中的find来查找:

tree.find('size').find('width').text
tree.find('size').find('height').text

注意的是,这里查找出来的486和500的值,是str类型而不是int,所以如果是需要为整型类型时,需要做类型转换

如果是多个同样节点,比如多个节点,如何读取呢?
这里使用findall来进行遍历访问,返回的是列表,也就是find获取的元素的集合,我们来看下多个节点的xml文件2007_000032.xml


	VOC2012
	2007_000032.jpg
	
		The VOC2007 Database
		PASCAL VOC2007
		flickr
	
	
		500
		281
		3
	
	1
	
		aeroplane
		Frontal
		0
		0
		
			104
			78
			375
			183
		
	
	
		aeroplane
		Left
		0
		0
		
			133
			88
			197
			123
		
	
	
		person
		Rear
		0
		0
		
			195
			180
			213
			229
		
	
	
		person
		Rear
		0
		0
		
			26
			189
			44
			238
		
	

可以看到有四个分别存储着四个不同的对象,我们来遍历这个节点,顺便将里面的锚框节点的四个属性(左上角和右下角的坐标)也给查找出来,这里我们通过字典保存每个对象方便后期调用,然后将字典都添加到一个列表里面:

tree = ET.parse('2007_000032.xml')
objects = []
for obj in tree.findall('object'):
    obj_dict = dict()
    obj_dict['name'] = obj.find('name').text
    bbox = obj.find('bndbox')
    obj_dict['bbox'] = [int(float(bbox.find('xmin').text)), int(float(bbox.find('ymin').text)), int(float(bbox.find('xmax').text)), int(float(bbox.find('ymax').text))]
    objects.append(obj_dict)
print(len(objects),objects)
print(objects[3]['bbox'])

'''
4 [{'name': 'aeroplane', 'bbox': [104, 78, 375, 183]}, {'name': 'aeroplane', 'bbox': [133, 88, 197, 123]}, {'name': 'person', 'bbox': [195, 180, 213, 229]}, {'name': 'person', 'bbox': [26, 189, 44, 238]}]
[26, 189, 44, 238]
'''

你可能感兴趣的:(Python,xml.etree,ElementTree,tree.find,tree.findall,python,xml)