批量修改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()