Python怎样实现批量修改xml的操作?
Admin 2022-12-12 群英技术资讯 293 次浏览
今天分享一个我自己写的实用脚本,主要是将.xml文件进行批量的修改
首先,声明我并不是很了解.xml的相关知识,所以今天主要是以我遇到的问题来做个记录。
想要更多的了解xml,请看最后的资料分享。
效果展示:
因为这些是属于我们项目小组的,我也不清楚是不是有什么不能公开的,我就截取了一小部分,原本是用lambelme来修改的,但由于xml文件似乎读不进去,所以只有手动修改,将water改为blue(重要的是一个一个用记事本打开,手动修改),这时候我的第一生产力产生了,because I am lazy。
这是下面的pyxml.py文件
import os import os.path import xml.dom.minidom as md path = 'E:\\Deeplearning\\Road_Detect_Project\\road_surface_mark\\Annot\\' files = os.listdir(path) # 得到文件夹下所有文件名称 def main(): for xmlFile in files: # 遍历文件夹 if not os.path.isdir(xmlFile): # 判断是否是文件夹,不是文件夹才打开 dom = md.parse(os.path.join(path,xmlFile)) root = dom.documentElement names = root.getElementsByTagName('name') #对某个标签进行修改 # print(name[0].firstChild.data) for i in range(len(names)): print(names[i].firstChild.data) a=names[i].firstChild.data print(type(a)) names[i].firstChild.data = "red" print(names[i].firstChild.data) with open(os.path.join(path,xmlFile), 'w') as fh: dom.writexml(fh) print('夏天是冰红茶的文件成功写入') #使用时,请不要删除这段 if __name__ == '__main__': main()
我说一下问题,因为小组的其他师兄有用中文路径,就会发生下面的情况:
但是记事本打开是正常的,也已经修改成功了。
我查了,是因为编码的问题,可以把XML文件的格式用记事本另存为ANSI就可以了(我不知道怎么另存为,可以看到记事本里面的编码格式是ANSI,所以我觉得这个方法是行得通的),还可以将第一行修改为
<?xml version="1.0" encoding="GBK"?>
这种我是成功了。(别建议我打马赛克)下次组会,我一定要提这个问题,以前因为路径中有中文吃了很多亏,所以我现在建工程都是尽量去用英文。
补充
除了上文的方法,小编还为大家整理了Python修改xml文件的其他方法,需要的可以参考一下
批量修改xml文件中指定位置内容
我要修改图片的绝对路径
#!/usr/bin/python ''' 此文件用于整理网络上搜集的数据集的xml文件,整理后方便用于训练。 ''' import os #文件操作相关 import xml.etree.ElementTree as ET #xml文件操作相关 """ "******************************************************************************************* *函数功能 : *输入参数 :输入裁剪后图像, *返 回 值 :无 *编写时间 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整个文件夹所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。 num = len(total_xml) # xml文件个数 print(num) print(total_xml[0]) for xmlfile in total_xml: #print(xml_id) in_file = open('%s/%s' % (xmlfilepath, xmlfile),encoding = 'UTF-8') #print(in_file) tree = ET.parse(in_file) #print(tree) root = tree.getroot() #print(root) obj = root.find('path') # 找到filename标签, #print(obj) path_text = obj.text #print(path_text) end = "\\" string2 = path_text[path_text.rfind(end):] # 在strint1中查找最后一个正斜杠/后面的字符,图片名称 #print(string2) path_text_1=string1+string2 #print("path_text_1:",path_text_1) obj.text = path_text_1 # 修改标签内容 tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 xmlfilepath = 'helmet_xml' # xml文件保存地址 # 要修改的内容 string1='E:\\1_Training_picture\\6_helmet\\helmet_train' change_all_xml(xmlfilepath,string1) print("ok")
修改path和filename
#!/usr/bin/python ''' 此文件用于整理网络上搜集的数据集的xml文件,整理后方便用于训练。 ''' import os #文件操作相关 import xml.etree.ElementTree as ET #xml文件操作相关 """ "******************************************************************************************* *函数功能 : *输入参数 :输入裁剪后图像, *返 回 值 :无 *编写时间 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整个文件夹所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。 num = len(total_xml) # xml文件个数 print(num) print(total_xml[0]) for xmlfile in total_xml: #print("**********************************************************************************************************") #print(xmlfile) in_file = open('%s/%s' % (xmlfilepath, xmlfile),encoding = 'UTF-8') #print(in_file) tree = ET.parse(in_file) #print(tree) root = tree.getroot() #print(root) obj = root.find('path') # 找到filename标签, #print(obj) path_text = obj.text #print(path_text) #end = "." end = "." string3 = path_text[path_text.rfind(end):] # 在strint1中查找最后一个反斜杠\后面的字符,图片名称 #print("string3:", string3) end = "." #string4 = string3[string3.rfind(end):] # 在strint1中查找最后一个正斜杠/后面的字符,图片名称 #print("string4:", string4) #print("xmlfile:", xmlfile) #print("string1:", string1) end = "." string2 = xmlfile[:xmlfile.rfind(end)] # 在strint1中查找最后一个正斜杠/后面的字符,图片名称 #print("string2:", string2) path_text_1 = string1 + string2+string3 #print("path_text_1:",path_text_1) obj.text = path_text_1 # 修改标签内容 #tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 obj_2 = root.find('filename') # 找到filename标签 #print("obj_2:", obj_2) path_text_2= string2+string3 #print("path_text_2:", path_text_2) obj_2.text = path_text_2 # 修改标签内容 tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 #xmlfilepath = 'temp' # xml文件保存地址 xmlfilepath = 'helmet_xml' # xml文件保存地址 # 要修改的内容 string1='E:\\1_Training_picture\\6_helmet\\helmet_train\\' change_all_xml(xmlfilepath,string1) print("ok")
最终版本
#!/usr/bin/python ''' 此文件用于整理网络上搜集的数据集的xml文件,整理后方便用于训练。 ''' import os #文件操作相关 import xml.etree.ElementTree as ET #xml文件操作相关 import cv2 #PRINT_FLAG=True PRINT_FLAG=False """ "******************************************************************************************* *函数功能 : *输入参数 :输入裁剪后图像, *返 回 值 :无 *编写时间 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整个文件夹所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。 num = len(total_xml) # xml文件个数 print(num) print(total_xml[0]) for xmlfile in total_xml: #print("**********************************************************************************************************") #print(xmlfile) in_file = open('%s/%s' % (xmlfilepath, xmlfile),encoding = 'UTF-8') #print(in_file) tree = ET.parse(in_file) #print(tree) root = tree.getroot() #print(root) obj = root.find('path') # 找到filename标签, #print(obj) path_text = obj.text #print(path_text) #end = "." end = "." string3 = path_text[path_text.rfind(end):] # 在strint1中查找最后一个反斜杠\后面的字符,图片名称 #print("string3:", string3) end = "." #string4 = string3[string3.rfind(end):] # 在strint1中查找最后一个正斜杠/后面的字符,图片名称 #print("string4:", string4) #print("xmlfile:", xmlfile) #print("string1:", string1) end = "." string2 = xmlfile[:xmlfile.rfind(end)] # 在strint1中查找最后一个正斜杠/后面的字符,图片名称 #print("string2:", string2) path_text_1 = string1 + string2+string3 try: #print("path_text_1:", path_text_1) image = cv2.imread(path_text_1,1) image.shape #cv2.imshow("aa",image) #cv2.waitKey(2000) #print('Open image ok! ') except: print('1111:Open image Error! Try again!') print("path_text_1:", path_text_1) string3='.jpg' path_text_1 = string1 + string2 + string3 print("path_text_1:", path_text_1) try: #print("path_text_1:", path_text_1) image = cv2.imread(path_text_1, 1) image.shape #cv2.imshow("aa",image) #cv2.waitKey(2000) print('Open image ok! ') print('*****************************************************************************') except: print('222 : Open image Error! Try again!') string3=".jpg" path_text_1 = string1 + string2 + string3 print("path_text_1:", path_text_1) #print("path_text_1:",path_text_1) obj.text = path_text_1 # 修改标签内容 #tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 obj_2 = root.find('filename') # 找到filename标签 # path_text_2= string2+string3 # obj_2.text = path_text_2 # 修改标签内容 if PRINT_FLAG==True: print("string1:", string1) print("string2:", string2) print("string3:", string3) print("path_text_1:", path_text_1) print("obj_2:", obj_2) print("path_text_2:", path_text_2) tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 #xmlfilepath = 'temp' # xml文件保存地址 xmlfilepath = 'helmet_xml' # xml文件保存地址 # 要修改的内容 string1='E:\\1_Training_picture\\6_helmet\\helmet_train\\' change_all_xml(xmlfilepath,string1) print("ok")
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了python sklearn 画出决策树并保存为PDF的实现过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Python3.x中input()函数接受一个标准输入数据,返回为string类型。Python2.x中input()相等于 eval(raw_input(prompt)) ,用来获取控制台的输入。raw_input()将所有输入作为字符串看待,返回字符串类型。而input()在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型(int,float)。注意
本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于pytorch模型保存与加载中的一些问题实战记录,下面一起来看一下,希望对大家有帮助。
html库是用于解析HTML的一个工具,是python自带的标准库之一,今天通过本文给大家介绍下python中的标准库html,感兴趣的朋友一起看看吧
这篇文章主要介绍了利用 Python 开发一个 Python 解释器,在本文中,我们将设计一个可以执行算术运算的解释器。下面我们大家一起来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008