【VOC格式xml文件解析】——Python

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/4/26 12:49
# @Author  : @linlianqin
# @Site    : 
# @File    : test1.py
# @Software: PyCharm
# @description:
import xml.etree.ElementTree as ET

def xmli(xmlpath):
	xmlTree = ET.parse(xmlpath) # 解析xml文件
	root = xmlTree.getroot() # 获得xml根节点
	size = root.find('size') # 查找size结点
	# 主要这里一定是findall,查找所有的object结点,也就是标注框的信息,否则用find返回的是Nonetype
	objects = root.findall('object') # 查找所有的object结点
	for obj in objects:
		bbox = obj.find('bndbox')
		# 修改相应结点的值
		bbox.find('ymin').text = str(222)
		bbox.find('ymax').text = str(222)
	return xmlTree # 返回更新后的xml文件句柄

xmlTree = xmli(r'test.xml')
xmlTree.write('_flip_updown.xml') # 存储新的xml文件

 

以下转自:python VOC格式的xml文件解析

python解析XML常见的有三种方法:

    xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合;
    xml.sax.*模块,它是SAX API的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存;
    xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。
 

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# get annotation object bndbox location
try:
    import xml.etree.cElementTree as ET  #解析xml的c语言版的模块
except ImportError:
    import xml.etree.ElementTree as ET
											         
##get object annotation bndbox loc start 
def GetAnnotBoxLoc(AnotPath):#AnotPath VOC标注文件路径
    tree = ET.ElementTree(file=AnotPath)  #打开文件,解析成一棵树型结构
    root = tree.getroot()#获取树型结构的根
    ObjectSet=root.findall('object')#找到文件中所有含有object关键字的地方,这些地方含有标注目标
    ObjBndBoxSet={} #以目标类别为关键字,目标框为值组成的字典结构
    for Object in ObjectSet:
        ObjName=Object.find('name').text
        BndBox=Object.find('bndbox')
        x1 = int(BndBox.find('xmin').text)#-1 #-1是因为程序是按0作为起始位置的
        y1 = int(BndBox.find('ymin').text)#-1
        x2 = int(BndBox.find('xmax').text)#-1
        y2 = int(BndBox.find('ymax').text)#-1
        BndBoxLoc=[x1,y1,x2,y2]
        if ObjBndBoxSet.__contains__(ObjName):
        	ObjBndBoxSet[ObjName].append(BndBoxLoc)#如果字典结构中含有这个类别了,那么这个目标框要追加到其值的末尾
        else:
        	ObjBndBoxSet[ObjName]=[BndBoxLoc]#如果字典结构中没有这个类别,那么这个目标框就直接赋值给其值吧
    return ObjBndBoxSet
##get object annotation bndbox loc end

其他xml文件的操作——写入、更新、读取请参考:python解析xml文件(解析、更新、写入)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有情怀的机械男

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值