翼度科技»论坛 编程开发 python 查看内容

Python实现批量修改xml文件的脚本

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
今天分享一个我自己写的实用脚本,主要是将.xml文件进行批量的修改
首先,声明我并不是很了解.xml的相关知识,所以今天主要是以我遇到的问题来做个记录。
想要更多的了解xml,请看最后的资料分享。
效果展示:

因为这些是属于我们项目小组的,我也不清楚是不是有什么不能公开的,我就截取了一小部分,原本是用lambelme来修改的,但由于xml文件似乎读不进去,所以只有手动修改,将water改为blue(重要的是一个一个用记事本打开,手动修改),这时候我的第一生产力产生了,because I am lazy。
这是下面的pyxml.py文件
  1. import os
  2. import os.path
  3. import xml.dom.minidom as md

  4. path = 'E:\\Deeplearning\\Road_Detect_Project\\road_surface_mark\\Annot\\'
  5. files = os.listdir(path)  # 得到文件夹下所有文件名称
  6. def main():
  7.     for xmlFile in files:  # 遍历文件夹
  8.         if not os.path.isdir(xmlFile):  # 判断是否是文件夹,不是文件夹才打开

  9.             dom = md.parse(os.path.join(path,xmlFile))
  10.             root = dom.documentElement
  11.             names = root.getElementsByTagName('name')  #对某个标签进行修改
  12.             # print(name[0].firstChild.data)
  13.             for i in range(len(names)):
  14.                 print(names[i].firstChild.data)
  15.                 a=names[i].firstChild.data
  16.                 print(type(a))
  17.                 names[i].firstChild.data = "red"
  18.                 print(names[i].firstChild.data)
  19.             with open(os.path.join(path,xmlFile), 'w') as fh:
  20.                 dom.writexml(fh)
  21.                 print('夏天是冰红茶的文件成功写入')  #使用时,请不要删除这段

  22. if __name__ == '__main__':
  23.     main()
复制代码
我说一下问题,因为小组的其他师兄有用中文路径,就会发生下面的情况:

但是记事本打开是正常的,也已经修改成功了。

我查了,是因为编码的问题,可以把XML文件的格式用记事本另存为ANSI就可以了(我不知道怎么另存为,可以看到记事本里面的编码格式是ANSI,所以我觉得这个方法是行得通的),还可以将第一行修改为
  1. <?xml version="1.0" encoding="GBK"?>
复制代码
这种我是成功了。(别建议我打马赛克)下次组会,我一定要提这个问题,以前因为路径中有中文吃了很多亏,所以我现在建工程都是尽量去用英文。

补充
除了上文的方法,小编还为大家整理了Python修改xml文件的其他方法,需要的可以参考一下
批量修改xml文件中指定位置内容
我要修改图片的绝对路径

  1. #!/usr/bin/python
  2. '''
  3. 此文件用于整理网络上搜集的数据集的xml文件,整理后方便用于训练。

  4. '''
  5. import os       #文件操作相关
  6. import xml.etree.ElementTree as ET  #xml文件操作相关

  7. """  "*******************************************************************************************
  8. *函数功能 :

  9. *输入参数 :输入裁剪后图像,
  10. *返 回 值 :无
  11. *编写时间 : 2021.7.12
  12. *作    者 : diyun
  13. ********************************************************************************************"""
  14. # 批量修改整个文件夹所有的xml文件
  15. def change_all_xml(xmlfilepath,string1):
  16.     total_xml = os.listdir(xmlfilepath)  # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。

  17.     num = len(total_xml)  # xml文件个数
  18.     print(num)
  19.     print(total_xml[0])
  20.     for xmlfile in total_xml:
  21.         #print(xml_id)
  22.         in_file = open('%s/%s' % (xmlfilepath, xmlfile),encoding = 'UTF-8')
  23.         #print(in_file)

  24.         tree = ET.parse(in_file)
  25.         #print(tree)
  26.         root = tree.getroot()
  27.         #print(root)
  28.         obj = root.find('path')  # 找到filename标签,
  29.         #print(obj)
  30.         path_text = obj.text
  31.         #print(path_text)
  32.         end = "\"
  33.         string2 = path_text[path_text.rfind(end):]  # 在strint1中查找最后一个正斜杠/后面的字符,图片名称
  34.         #print(string2)
  35.         path_text_1=string1+string2
  36.         #print("path_text_1:",path_text_1)
  37.         obj.text = path_text_1  # 修改标签内容
  38.         tree.write('%s/%s' % (xmlfilepath, xmlfile))  # 保存修改


  39. xmlfilepath = 'helmet_xml'  # xml文件保存地址
  40. # 要修改的内容
  41. string1='E:\\1_Training_picture\\6_helmet\\helmet_train'

  42. change_all_xml(xmlfilepath,string1)
  43. print("ok")
复制代码
修改path和filename
  1. #!/usr/bin/python
  2. '''
  3. 此文件用于整理网络上搜集的数据集的xml文件,整理后方便用于训练。

  4. '''
  5. import os       #文件操作相关
  6. import xml.etree.ElementTree as ET  #xml文件操作相关

  7. """  "*******************************************************************************************
  8. *函数功能 :

  9. *输入参数 :输入裁剪后图像,
  10. *返 回 值 :无
  11. *编写时间 : 2021.7.12
  12. *作    者 : diyun
  13. ********************************************************************************************"""
  14. # 批量修改整个文件夹所有的xml文件
  15. def change_all_xml(xmlfilepath,string1):
  16.     total_xml = os.listdir(xmlfilepath)  # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。

  17.     num = len(total_xml)  # xml文件个数
  18.     print(num)
  19.     print(total_xml[0])
  20.     for xmlfile in total_xml:
  21.         #print("**********************************************************************************************************")
  22.         #print(xmlfile)
  23.         in_file = open('%s/%s' % (xmlfilepath, xmlfile),encoding = 'UTF-8')
  24.         #print(in_file)

  25.         tree = ET.parse(in_file)
  26.         #print(tree)
  27.         root = tree.getroot()
  28.         #print(root)
  29.         obj = root.find('path')  # 找到filename标签,
  30.         #print(obj)
  31.         path_text = obj.text
  32.         #print(path_text)
  33.         #end = "."
  34.         end = "."
  35.         string3 = path_text[path_text.rfind(end):]  # 在strint1中查找最后一个反斜杠\后面的字符,图片名称
  36.         #print("string3:", string3)
  37.         end = "."
  38.         #string4 = string3[string3.rfind(end):]  # 在strint1中查找最后一个正斜杠/后面的字符,图片名称
  39.         #print("string4:", string4)

  40.         #print("xmlfile:", xmlfile)
  41.         #print("string1:", string1)
  42.         end = "."
  43.         string2 = xmlfile[:xmlfile.rfind(end)]  # 在strint1中查找最后一个正斜杠/后面的字符,图片名称
  44.         #print("string2:", string2)
  45.         path_text_1 = string1 + string2+string3
  46.         #print("path_text_1:",path_text_1)
  47.         obj.text = path_text_1  # 修改标签内容
  48.         #tree.write('%s/%s' % (xmlfilepath, xmlfile))  # 保存修改
  49.         obj_2 = root.find('filename')  # 找到filename标签
  50.         #print("obj_2:", obj_2)
  51.         path_text_2= string2+string3
  52.         #print("path_text_2:", path_text_2)
  53.         obj_2.text = path_text_2  # 修改标签内容
  54.         tree.write('%s/%s' % (xmlfilepath, xmlfile))  # 保存修改

  55. #xmlfilepath = 'temp'  # xml文件保存地址
  56. xmlfilepath = 'helmet_xml'  # xml文件保存地址
  57. # 要修改的内容
  58. string1='E:\\1_Training_picture\\6_helmet\\helmet_train\\'

  59. change_all_xml(xmlfilepath,string1)
  60. print("ok")
复制代码
最终版本
  1. #!/usr/bin/python
  2. '''
  3. 此文件用于整理网络上搜集的数据集的xml文件,整理后方便用于训练。

  4. '''
  5. import os       #文件操作相关
  6. import xml.etree.ElementTree as ET  #xml文件操作相关
  7. import cv2
  8. #PRINT_FLAG=True
  9. PRINT_FLAG=False

  10. """  "*******************************************************************************************
  11. *函数功能 :

  12. *输入参数 :输入裁剪后图像,
  13. *返 回 值 :无
  14. *编写时间 : 2021.7.12
  15. *作    者 : diyun
  16. ********************************************************************************************"""
  17. # 批量修改整个文件夹所有的xml文件
  18. def change_all_xml(xmlfilepath,string1):
  19.     total_xml = os.listdir(xmlfilepath)  # 用于返回指定的文件夹包含的文件或文件夹的名字的列表。

  20.     num = len(total_xml)  # xml文件个数
  21.     print(num)
  22.     print(total_xml[0])
  23.     for xmlfile in total_xml:
  24.         #print("**********************************************************************************************************")
  25.         #print(xmlfile)
  26.         in_file = open('%s/%s' % (xmlfilepath, xmlfile),encoding = 'UTF-8')
  27.         #print(in_file)

  28.         tree = ET.parse(in_file)
  29.         #print(tree)
  30.         root = tree.getroot()
  31.         #print(root)
  32.         obj = root.find('path')  # 找到filename标签,
  33.         #print(obj)
  34.         path_text = obj.text
  35.         #print(path_text)
  36.         #end = "."
  37.         end = "."
  38.         string3 = path_text[path_text.rfind(end):]  # 在strint1中查找最后一个反斜杠\后面的字符,图片名称
  39.         #print("string3:", string3)
  40.         end = "."
  41.         #string4 = string3[string3.rfind(end):]  # 在strint1中查找最后一个正斜杠/后面的字符,图片名称
  42.         #print("string4:", string4)

  43.         #print("xmlfile:", xmlfile)
  44.         #print("string1:", string1)
  45.         end = "."
  46.         string2 = xmlfile[:xmlfile.rfind(end)]  # 在strint1中查找最后一个正斜杠/后面的字符,图片名称
  47.         #print("string2:", string2)
  48.         path_text_1 = string1 + string2+string3
  49.         try:
  50.             #print("path_text_1:", path_text_1)
  51.             image = cv2.imread(path_text_1,1)
  52.             image.shape
  53.             #cv2.imshow("aa",image)
  54.             #cv2.waitKey(2000)

  55.             #print('Open image ok! ')
  56.         except:
  57.             print('1111:Open image Error! Try again!')
  58.             print("path_text_1:", path_text_1)
  59.             string3='.jpg'
  60.             path_text_1 = string1 + string2 + string3
  61.             print("path_text_1:", path_text_1)
  62.             try:
  63.                 #print("path_text_1:", path_text_1)
  64.                 image = cv2.imread(path_text_1, 1)
  65.                 image.shape
  66.                 #cv2.imshow("aa",image)
  67.                 #cv2.waitKey(2000)
  68.                 print('Open image ok! ')
  69.                 print('*****************************************************************************')
  70.             except:
  71.                 print('222 : Open image Error! Try again!')
  72.                 string3=".jpg"
  73.                 path_text_1 = string1 + string2 + string3
  74.                 print("path_text_1:", path_text_1)

  75.         #print("path_text_1:",path_text_1)
  76.         obj.text = path_text_1  # 修改标签内容
  77.         #tree.write('%s/%s' % (xmlfilepath, xmlfile))  # 保存修改
  78.         obj_2 = root.find('filename')  # 找到filename标签
  79.         #
  80.         path_text_2= string2+string3
  81.         #
  82.         obj_2.text = path_text_2  # 修改标签内容
  83.         if PRINT_FLAG==True:
  84.             print("string1:", string1)
  85.             print("string2:", string2)
  86.             print("string3:", string3)
  87.             print("path_text_1:", path_text_1)
  88.             print("obj_2:", obj_2)
  89.             print("path_text_2:", path_text_2)
  90.         tree.write('%s/%s' % (xmlfilepath, xmlfile))  # 保存修改

  91. #xmlfilepath = 'temp'  # xml文件保存地址
  92. xmlfilepath = 'helmet_xml'  # xml文件保存地址
  93. # 要修改的内容
  94. string1='E:\\1_Training_picture\\6_helmet\\helmet_train\\'

  95. change_all_xml(xmlfilepath,string1)
  96. print("ok")
复制代码
到此这篇关于Python实现批量修改xml文件的脚本的文章就介绍到这了,更多相关Python批量修改xml文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/article/266702.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具