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

作者:夏天是冰红茶 时间:2022-01-14 06:14:03 

今天分享一个我自己写的实用脚本,主要是将.xml文件进行批量的修改

首先,声明我并不是很了解.xml的相关知识,所以今天主要是以我遇到的问题来做个记录。

想要更多的了解xml,请看最后的资料分享。

效果展示:

Python实现批量修改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()

 我说一下问题,因为小组的其他师兄有用中文路径,就会发生下面的情况:

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

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

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

我查了,是因为编码的问题,可以把XML文件的格式用记事本另存为ANSI就可以了(我不知道怎么另存为,可以看到记事本里面的编码格式是ANSI,所以我觉得这个方法是行得通的),还可以将第一行修改为

<?xml version="1.0" encoding="GBK"?>

这种我是成功了。(别建议我打马赛克)下次组会,我一定要提这个问题,以前因为路径中有中文吃了很多亏,所以我现在建工程都是尽量去用英文。

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

补充

除了上文的方法,小编还为大家整理了Python修改xml文件的其他方法,需要的可以参考一下

批量修改xml文件中指定位置内容

我要修改图片的绝对路径

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

Python实现批量修改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")

来源:https://blog.csdn.net/m0_62919535/article/details/127677654

标签:Python,修改,xml
0
投稿

猜你喜欢

  • tensorflow tf.train.batch之数据批量读取方式

    2023-12-08 01:11:51
  • 读取input:file的路径并显示本地图片的方法

    2024-04-17 10:38:30
  • 如何在asp中创建DSN?

    2009-11-14 20:46:00
  • Python中使用OpenCV库来进行简单的气象学遥感影像计算

    2021-02-02 09:45:49
  • python下setuptools的安装详解及No module named setuptools的解决方法

    2022-12-21 00:56:46
  • JS数组遍历中for,for in,for of,map,forEach各自的使用方法与优缺点

    2024-05-02 16:15:45
  • Python学习之日志模块详解

    2022-06-24 09:20:22
  • 如何取消pyecharts绘制地图时默认显示小圆点标识

    2021-05-06 19:43:35
  • Django密码系统实现过程详解

    2022-10-13 15:55:33
  • python scipy求解非线性方程的方法(fsolve/root)

    2022-01-06 15:46:00
  • MySql学习笔记之事务隔离级别详解

    2024-01-21 23:54:28
  • SQLPlus命令操作用法详解

    2024-01-27 23:00:18
  • 关于HTML5的data-*自定义属性的总结

    2024-04-19 10:17:50
  • 用ASP判断客户端浏览器语言自动跳转

    2010-07-09 13:34:00
  • Python日志模块logging简介

    2022-07-14 23:55:22
  • oracle 日期函数集合(集中版本)第1/2页

    2009-06-19 17:23:00
  • python利用pandas将excel文件转换为txt文件的方法

    2022-04-05 18:49:01
  • 一文详解Python定时任务触发

    2021-05-13 14:27:02
  • 交互设计实用指南系列(7)–避免迷路

    2010-01-23 09:52:00
  • Mysql GTID Mha配置方法

    2024-01-16 22:58:51
  • asp之家 网络编程 m.aspxhome.com