Python实现批量修改xml文件的脚本
作者:夏天是冰红茶
这篇文章主要为大家详细介绍了如何通过Python实现批量修改xml文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
今天分享一个我自己写的实用脚本,主要是将.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")
到此这篇关于Python实现批量修改xml文件的脚本的文章就介绍到这了,更多相关Python批量修改xml文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!