ElementTree 패키지는 xml 파일을 구문 분석합니다.

딥 러닝에서 많은 데이터 세트의 주석은 xml 형식으로 저장됩니다.
이 기사에서는 VOC2012 데이터 세트의 주석 파일을 예로 들어 ElementTree 패키지의 사용을 탐색합니다
.하지만 이 클래스를 사용하여 xml 주석 파일을 구문 분석할 수 있습니다. 데이터 세트, 깊이 연구하지 않았습니다)

xml 파일 형식

<root>  # 最开始的标签叫做根标签,根标签的名字是root
    <part>  # 子标签,子标签名字为part,可以重复
        <name>123</name>  # 子标签中的元素
        <age>20</age>
        <sex></sex>
    </part>
    <part>
        <name>456</name>
        <age>40</age>
        <sex></sex>
    </part>
</root>

ElementTree 소개

패키지를 참조하는 일반적인 방법은 다음과 같습니다. import xml.etree.ElementTree as ET

class ElementTree:
    """
    ElementTree类是专门解析xml的一个类,在xml.etree.ElementTree包中
    """
    def __init__(self, element=None, file=None):
    	"""
    	element:指的是xml文件的根节点
    	file:指的是已经使用open打开的一个文件对象
    	"""
    def getroot(self):
        """
        返回树的根节点
        """
    def _setroot(self, element):
        """
        替换根节点
        """
    def parse(self, source, parser=None):
        """
        加载xml文件,解析文件
        source:是open打开的xml文件的对象
        parser:是是用什么方式解析xml文件
        return:返回值是xml文件的根节点
        """

    def iter(self, tag=None):
        """
        创建并返回根标签下所有的元素的迭代器
        tag:字符串,指的是根标签下的元素的子标签名称,如果不指定,就返回所有的子标签,如果指定只返回该名称的子节点
        """

    # compatibility
    def getiterator(self, tag=None):
        """
		这个方法已经弃用了,使用上面的iter替代
		"""
        warnings.warn(
            "This method will be removed in future versions.  "
            "Use 'tree.iter()' or 'list(tree.iter())' instead.",
            PendingDeprecationWarning, stacklevel=2
        )
        return list(self.iter(tag))

    def find(self, path, namespaces=None):
        """
        查找名为path标签的内容
        path:要查找的标签名字
        """
    def findtext(self, path, default=None, namespaces=None):
        """
		根据标记名称或路径找到第一个匹配的元素
		path:查找的子标签的名称
		namespace:命名空间
		返回值是要查找的标签的内容,不存在时返回None
        """
    def findall(self, path, namespaces=None):
        """
		查找所有名为path的子标签的内容
		path:标签的名称
		namespace:命名空间
		返回值是一个list,包含所有的名称为path的子标签的内容
        """
    def iterfind(self, path, namespaces=None):
        """
        根据标记名称找到所有的名为path的子标签的内容,返回值是一个迭代器
        path:
        namespace:
        返回值是一个迭代器
        """       
    def write(self, file_or_filename,
              encoding=None,
              xml_declaration=None,
              default_namespace=None,
              method=None, *,
              short_empty_elements=True):

코드 예제

VOC 데이터 세트의 xml 주석 파일
여기에 이미지 설명 삽입

import xml.etree.ElementTree as ET

PATH = r"E:\pycharm\pytorch_object_detection\my_test\2007_000027.xml"

# xml文件解析,返回根节点:root = 'annotation'
root = ET.ElementTree().parse(open(PATH, 'r', encoding="utf-8"))

for obj in root.iter('object'):  # 在root标签下找到所有的名为object的标签,并返回她们的迭代器
    print(obj.find('name').text)  # 查看obj标签下的子标签name的内容
    box = obj.find('bndbox')  # 查找object标签下子标签bnbox的元素,并打印其中的子标签的text
    print(box.find('xmin').text, box.find('ymin').text, box.find('xmax').text, box.find('ymax').text)
    print("====================================================================================")
    for part in obj.findall('part'):  # 将所有的名为part的子标签返回到一个列表中,并获取其中的内容
        print(part.find('name').text)
        print(part.find('bndbox').findtext('xmin'),  # findtext返回查找到的第一个名为xmin的标签的内容
              part.find('bndbox').findtext('ymin'),
              part.find('bndbox').findtext('xmax'),
              part.find('bndbox').findtext('ymax'))

추천

출처blog.csdn.net/weixin_50727642/article/details/124770776