Python批量修改、删除、替换xml文件内容(labelimg标注)

Python批量修改、删除、替换xml文件内容(labelimg标注),第1张

使用模型训练自定义数据集之前,在用在网上搜索得到的图片制作数据集时,即使批量修改图片名称后,在使用labelimg标注得到的xml文件中,图片名称还是网络上图片原本的名称,这时需要对其进行批量修改。


	测试图片
	ae2f50b6a937df1e1a72f9bcc45b172d.jpg
	F:\项目图像数据集\ae2f50b6a937df1e1a72f9bcc45b172d.jpg
	
		Unknown
	
	
		800
		800
		3
	
	0
	
		class1
		Unspecified
		0
		0
		
			631
			275
			714
			509
		
	

然后先修改路径,将xml文件对应图片的真实路径替换。这里图片的名称是采用12位数字排序的。

import xml.dom.minidom
import os

path = r'D:\test\xmltest\xml_source'  # xml文件存放路径
sv_path = r'D:\test\xmltest\xml_save'  # 修改后的xml文件存放路径
files = os.listdir(path)
cnt = 0

for xmlFile in files:
    dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))  # 打开xml文件,送到dom解析
    root = dom.documentElement  # 得到文档元素对象
    item = root.getElementsByTagName('path')  # 获取path这一node名字及相关属性值
    for i in item:
        i.firstChild.data = f'D:/test/xmltest/xml_source/' + str(cnt).zfill(12) + '.jpg'  # xml文件对应的图片路径

    with open(os.path.join(sv_path, xmlFile), 'w', encoding='utf-8') as fh:
        dom.writexml(fh)
    cnt += 1

修改后变成这样。


	测试图片
	ae2f50b6a937df1e1a72f9bcc45b172d.jpg
	D:/test/xmltest/JPEGimage/000000000000.jpg
	
		Unknown
	
	
		800
		800
		3
	
	0
	
		class1
		Unspecified
		0
		0
		
			631
			275
			714
			509
		
	

接下来修改图片名称。

import xml.dom.minidom
import os

path = r'D:\test\xmltest\xml_source'  # xml文件存放路径
sv_path = r'D:\test\xmltest\xml_save'  # 修改后的xml文件存放路径
files = os.listdir(path)

for xmlFile in files:
    dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))  # 打开xml文件,送到dom解析
    root = dom.documentElement  # 得到文档元素对象
    names = root.getElementsByTagName('filename')
    a, b = os.path.splitext(xmlFile)  # 分离出文件名a
    for n in names:
        n.firstChild.data = a + '.jpg'
    with open(os.path.join(sv_path, xmlFile), 'w', encoding='utf-8') as fh:
        dom.writexml(fh)

xml文件中的图片名称和已经修改好了。


	测试图片
	000000000000.jpg
	D:/test/xmltest/JPEGimage/000000000000.jpg
	
		Unknown
	
	
		800
		800
		3
	
	0
	
		class1
		Unspecified
		0
		0
		
			631
			275
			714
			509
		
	

得到的xml文件会显示版本号,如果直接用xml文件训练可能会报错,所以还需删除。如果需要删除或者替换其他属性,也可在此修改。

# -*- coding:utf-8 -*-

# 将a替换成b

import os

xmldir = r'D:\test\xmltest\xml_source'
savedir = r'D:\test\xmltest\xml_save'
xmllist = os.listdir(xmldir)
for xml in xmllist:
    if '.xml' in xml:
        fo = open(savedir + '/' + '{}'.format(xml), 'w', encoding='utf-8')
        print('{}'.format(xml))
        fi = open(xmldir + '/' + '{}'.format(xml), 'r', encoding='utf-8')
        content = fi.readlines()
        for line in content:
            # line = line.replace('a', 'b')        # 例:将a替换为b
            line = line.replace('', '')
            line = line.replace('测试图片', '车辆图片')
            line = line.replace('class1', 'class2')
            fo.write(line)
        fo.close()
        print('替换成功')

# 如通b为空字符串,就是删除

大功告成。


	车辆图片
	000000000000.jpg
	D:/test/xmltest/JPEGimage/000000000000.jpg
	
		Unknown
	
	
		800
		800
		3
	
	0
	
		class2
		Unspecified
		0
		0
		
			631
			275
			714
			509
		
	

参考代码

python批量修改xml文件的属性(filename/path) - 代码先锋网python批量修改xml文件的属性(filename/path),代码先锋网,一个为软件开发程序员提供代码片段和技术文章聚合的网站。https://www.codeleading.com/article/67672212062/Python: 文件夹下xml内容批量替换、删除_南石北岸生的博客-CSDN博客_python替换xml 内容 功能:对文件夹下的所有xml进行批量替换或删除。#-*- coding:utf-8 -*-#将a替换成bimport osxmldir=''savedir=''xmllist=os.listdir(xmldir)for xml in xmllist: if '.xml' in xml: fo=open(savedir+'/'+'new_{}'.for...https://blog.csdn.net/gusui7202/article/details/85194806

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/870717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存