将XML文件中的内容批量修改

批量修改VOC数据集中xml标签文件的标签名称

第一版:每次都只单一xml文件中的内容进行修改,较为麻烦

import os
import xml.etree.ElementTree as ET
 
#程序功能:批量修改VOC数据集中xml标签文件的标签名称
def changelabelname(inputpath):
    listdir = os.listdir(inputpath)
    for file in listdir:
        if file.endswith('xml'):
            file = os.path.join(inputpath,file)
            tree = ET.parse(file)
            root = tree.getroot()
            for object1 in root.findall('object'):
                for sku in object1.findall('name'):           #查找需要修改的名称
                    if (sku.text == 'mos'):               #‘preName’为修改前的名称
                        sku.text = 'mosquitto'                 #‘TESTNAME’为修改后的名称
                        tree.write(file,encoding='utf-8')     #写进原始的xml文件并避免原始xml中文字符乱码
                    else:
                        pass
        else:
            pass

def changelabelfilename(inputpath):
    listdir = os.listdir(inputpath)
    print('11')
    for file in listdir:
        if file.endswith('xml'):
            file = os.path.join(inputpath,file)
            tree = ET.parse(file)
            root = tree.getroot()
            #print('22')

            for ss in root.findall('filename'):           #查找需要修改的名称
                #print(str(ss.text))
                ss1 = ss.text.split('.')
                ss2 = ss1[1]
                ss3 = ss1[0]
                #print(ss2)
                if (ss2 == 'png'):               #‘preName’为修改前的名称
                   #‘TESTNAME’为修改后的名称

                    ss.text = ss3+'.jpg'
                    tree.write(file, encoding='utf-8')  # 写进原始的xml文件并避免原始xml中文字符乱码
                    # with open('C:\\Users\\luchenxun\\Desktop\\Annotations\\filename','w')as f1:
                    #     f1.write(ss)
                    #     print(ss)
                else:
                    pass
        else:
            pass

def changepath(inputpath):
    listdir = os.listdir(inputpath)
    for file in listdir:
        if file.endswith('xml'):
            file = os.path.join(inputpath, file)
            tree = ET.parse(file)
            root = tree.getroot()
            #for object1 in root.findall('annotation verified="yes"'):
            for sa in root.findall('path'):  # 查找需要修改的名称
                sa1 = sa.text.split('.')
                sa2 = sa1[1]
                sa3 = sa1[0]
                if (sa2 == 'png'):  # ‘preName’为修改前的名称
                    #sa2.text = 'jpg'   ‘TESTNAME’为修改后的名称
                    sa.text = sa3+'.jpg'
                    tree.write(file, encoding='utf-8')  # 写进原始的xml文件并避免原始xml中文字符乱码
                else:
                    pass
        else:
            pass

if __name__ == '__main__':
    inputpath = 'C:\\Users\\luchenxun\\Desktop\\Annotations'  #此处替换为自己的路径,双斜线
    changelabelname(inputpath)
    changelabelfilename(inputpath)
    changepath(inputpath)

第二版:将功能封装为一个函数,一次性实现xml文件中3个内容的修改

class BatchRename_xml():

    #批量重命名文件夹中的xml文件名
    
    def __init__(self):
        self.path = 'C:\\Users\\luchenxun\\data_7.5\\Annotations1'  #表示需要命名处理的文件夹
        self.save_path = 'C:\\Users\\luchenxun\\data_7.5\\Annotations2'#保存重命名后的图片地址
        self.jpg_path = 'C:\\Users\\luchenxun\\data_7.5\\JPEGImages1'
        self.jpg_path1 = 'C:\\Users\\luchenxun\\data_7.5\\JPEGImages2'
    def rename(self):

        if not os.path.exists(self.save_path):
            os.mkdir(self.save_path)
        else:
            shutil.rmtree(self.save_path)
            os.mkdir(self.save_path)

        filelist = os.listdir(self.path) #获取文件路径
        jfilelist = os.listdir(self.jpg_path)
        total_num = len(filelist) #获取文件长度(个数)
        i = 1  #表示文件的命名是从1开始的
        for item in filelist:

            if item.endswith('.xml'):  #初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)
                src = os.path.join(os.path.abspath(self.path), item)#当前文件中图片的地址
                dst = os.path.join(os.path.abspath(self.save_path), ''+str(i) + '.xml')#处理后文件的地址和名称,可以自己按照自己的要求改进

                file = os.path.join(self.path, item)
                tree = ET.parse(file)
                root = tree.getroot()

                for file_name in root.findall('filename'):  # 查找需要修改的名称
                    for path_name in root.findall('path'):
                        for jpg_name in jfilelist:
                            ss2 = file_name.text.split('.')[1]
                            sa2 = path_name.text.split('.')[-1]
                            if (sa2 == 'jpg'):
                                path_name.text = 'C:/Users/luchenxun/data_7.5/JPEGImages/' + '' + str(i) + '.jpg'
                                tree.write(file, encoding='utf-8')  # 写进原始的xml文件并避免原始xml中文字符乱码
                            if (ss2 == 'jpg'):
                                file_name.text = '' + str(i) + '.jpg'
                                #print(file_name)
                                tree.write(file, encoding='utf-8')  # 写进原始的xml文件并避免原始xml中文字符乱码
                            if jpg_name.endswith('.jpg'):
                                    Old = os.path.join(os.path.abspath(self.jpg_path), jpg_name)
                                    New = os.path.join(os.path.abspath(self.jpg_path), '' + str(i) + '.jpg')


                try:
                    os.rename(src, dst)
                    os.rename(Old, New)
                    #print ('converting %s to %s ...' % (src, dst))
                    if i < total_num:
                        i = i + 1
                except:
                    continue

if __name__ == '__main__':
    inputpath = 'C:\\Users\\luchenxun\\data_7.5\\Annotations2\\' #此处替换为自己的路径,双斜线
    #changelabelfilename(inputpath)
    #listfiles(inputpath)
    '''demo = BatchRename_jpg()
    demo.rename()'''
    demo = BatchRename_xml()
    demo.rename_xml()

你可能感兴趣的:(xml,python,开发语言)