把多个xmL文件数据整合到另一个文件xml中

把多个xmL文件内容写入到另一个文件xml中

"""
把多个xmL文件写入到一个文件xml中
"""
import os
import xml.etree.ElementTree as ET


# 加空格解决排版问题
def indent(elem, level=0):
    i = "\n" + level * " "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + " "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level + 1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i


def handle_xml(image_name, src_path):
    # 判断是否有根节点
    try:
        tree = ET.parse("pre_knowledge.xml")
        root = tree.getroot()  # 数据内存地址
        # print(root.tag)  # 标签
    except:
        # 创建根节点
        root = ET.Element("root")
        # print(root)

    annotation = ET.SubElement(root, "annotation")
    deviceid = ET.SubElement(annotation, "deviceid")  # SubElement 子节点
    list01 = image_name.split("_")
    name_text = list01[1] + '_' + list01[2]
    deviceid.text = name_text
    # 写入元素节点
    # 读取文件,然后依次遍历每个文件下xml的size标签属性和object标签属性
    # print(os.path.join(src_path,image_name))
    target_dom = ET.parse(os.path.join(src_path, image_name))
    target_root = target_dom.getroot()  # 数据内存地址
    # print(target_dom)
    # 创建子节点
    size = ET.SubElement(deviceid, "size")  # SubElement 子节点
    for ta in target_root.iter("size"):
        for i in ta:
            i_tag = ET.SubElement(size, i.tag)  # SubElement 子节点
            i_tag.text = i.text

    for i in target_root.iter('object'):
        object = ET.SubElement(deviceid, "object")
        for j in i:
            if j.tag == 'name':
                j_tag = ET.SubElement(object, j.tag)  # SubElement 子节点
                j_tag.text = j.text
                print(j.tag, j.text)
            if j.tag == 'bndbox':
                j_tag = ET.SubElement(object, j.tag)  # SubElement 子节点
                for m in j:
                    m_tag = ET.SubElement(j_tag, m.tag)  # SubElement 子节点
                    m_tag.text = m.text

    # 保存
    indent(root)
    et = ET.ElementTree(root)  # 生成文档对象
    et.write("pre_knowledge01.xml", encoding="utf-8", xml_declaration=True)
    # 显示结果
    # ET.dump(root)


if __name__ == "__main__":
    src_path = 'D:/picture/error_fencuo/xml/'
    f = open('pre_knowledge.xml', 'a', encoding='utf-8')
    for path, dirs, files in os.walk(src_path):
        for file_name in files:
            print(file_name)
            if not file_name.endswith('.xml'):
                continue
            handle_xml(file_name, src_path)
    f.close()

猜你喜欢

转载自blog.csdn.net/weixin_44996884/article/details/105891379