欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【工具脚本】读取VOC格式的标注xml文件,并修改xml中的内容

程序员文章站 2022-04-17 21:22:03
...

功能:读取xml文件,并根据需求修改里面的内容。

1)修改xml文件中标注框的xmin,xmax,ymin,ymax的坐标值,当坐标值越界时,对其进行修改。

2)修改xml中filename的值(即标注文件对应图片的名称)。

注意:使用python3运行,python2运行时会报错(encoding相关的).

# coding=utf-8
import os
import os.path
import xml.dom.minidom

# 将string转换为int
def to_int(str):
    try:
        int(str)
        return int(str)
    except ValueError: #报类型错误,说明不是整型的
        try:
            float(str) #用这个来验证,是不是浮点字符串
            return int(float(str))
        except ValueError:  #如果报错,说明即不是浮点,也不是int字符串。   是一个真正的字符串
            return False

root = r"/data_1/样本"  #根目录路径
path = root + '/xml'   #输入文件夹
save_path = root + '/newxml'  #输出文件夹
if not os.path.isdir(save_path):
    os.makedirs(save_path)
files = os.listdir(path)  # 得到文件夹下所有r文件名称
s = []
for xmlFile in files:
    # 遍历文件夹
    portion = os.path.splitext(xmlFile)
    if not os.path.isdir(xmlFile):
        # 判断是否是文件夹,不是文件夹才打开
        print (xmlFile)

        # xml文件读取操作
        # 将获取的xml文件名送入到dom解析
        dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))
        # 最核心的部分os.path.join(path,xmlFile),路径拼接,输入的是具体路径
        root = dom.documentElement

        # 修改xmin
        xmin = root.getElementsByTagName('xmin')
        for i in range(len(xmin)):
            if to_int(xmin[i].firstChild.data) < 0:
                xmin[i].firstChild.data = 0
                print(">>>>>>>>>>>>>>>>>>>xmin修改为:"+str(xmin[i].firstChild.data))
        
        # 修改ymin
        ymin = root.getElementsByTagName('ymin')
        for i in range(len(ymin)):
            if to_int(ymin[i].firstChild.data) < 0:
                ymin[i].firstChild.data = 0
                print(">>>>>>>>>>>>>>>>>>>ymin修改为:"+str(ymin[i].firstChild.data))
        
        # 获取图像的宽高
        width = 0
        height = 0
        img_w = root.getElementsByTagName('width')
        for i in range(len(img_w)):
            width = to_int(img_w[i].firstChild.data)
        
        img_h = root.getElementsByTagName('height')
        for i in range(len(img_h)):
            height = to_int(img_h[i].firstChild.data)
        
        # 修改xmax
        xmax = root.getElementsByTagName('xmax')
        for i in range(len(xmax)):
            if to_int(xmax[i].firstChild.data) > width:
                xmax[i].firstChild.data = width
                print(">>>>>>>>>>>>>>>>>>>xmax修改为"+str(xmax[i].firstChild.data))
        
        # 修改ymax
        ymax = root.getElementsByTagName('ymax')
        for i in range(len(ymax)):
            if to_int(ymax[i].firstChild.data) > height:
                ymax[i].firstChild.data = height
                print(">>>>>>>>>>>>>>>>>>>ymax修改为:"+str(ymax[i].firstChild.data))

        # # 修改图像的尺寸
        # if width > height:
        #     for i in range(len(img_h)):
        #         img_h[i].firstChild.data = width
        # elif width < height:
        #     for i in range(len(img_w)):
        #         img_w[i].firstChild.data = height
        # else:
        #     print("need not alter!")

        # 保存修改到xml文件中
        with open(os.path.join(save_path, xmlFile), 'w', encoding='UTF-8') as fh:
            dom.writexml(fh)
            print('process...')

        # name = root.getElementsByTagName('name')
        # # pose=root.getElementsByTagName('pose')
        # # 重命名class name
        # for i in range(len(name)):
        #     # print (name[i].firstChild.data)
        #     # print(xmlFile)
        #     # if portion[1] == ".xml":
        #     #     newname = portion[0] + ".jpg"
        #     #     print(newname)
        #     newname = "zero"
        #     if name[i].firstChild.data == "chebiao":
        #         name[i].firstChild.data = newname
        #         print(name[i].firstChild.data)

 

相关标签: 工具脚本