资讯详情

将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()

标签: 300kn70sa3载荷传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台