今天分享一个我自己写的实用脚本,主要是将.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\")
© 版权声明
THE END
暂无评论内容