Python实现批量修改xml文件的脚本
作者:夏天是冰红茶 发布时间:2022-01-14 06:14:03
标签: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")
来源:https://blog.csdn.net/m0_62919535/article/details/127677654


猜你喜欢
- 在Python中,安装第三方模块,是通过setuptools这个工具完成的。Python有两个封装了setuptools的包管理工具:eas
- 用户日活百万级,注册用户千万级,而且若还没有进行分库分表,则该DB里的用户表可能就一张,单表上千万的用户数据。某系统专门通过各种条件筛选大量
- DesktopNexus 是我最喜爱的一个壁纸下载网站,上面有许多高质量的壁纸,几乎每天必上, 每月也必会坚持分享我这个月来收集的壁纸但是
- 在做分类模型时候,需要在DataFrame中按照行获取数据以便于进行训练和测试。import pandas as pddict=[[1,2,
- 1.安装pymysql:pip install pymysql (在命令行窗口中执行)2.卸载pymysql:pip uninstall p
- 方式1:引入普通的js文件,如user.js1.1、属性和方法都写在一个变量内部const user={ logi
- 1.性能Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整
- 本文实例为大家分享了python封装对象实现时间效果的具体代码,供大家参考,具体内容如下# 钟表import timeclass Clock
- php有哪些优点?PHP优点:1.入门快,有其它语言基础的程序员二周左右的时间就可以入门,一个月左右的时间基本上就可以开发简单的项目了。2.
- 1.官网下载MySQL下载Mysql点击下载mysql. 或点击这里下载下载完成后解压到某一个文件夹(记住这个路径,一会要用到)2.配置初始
- 前言由于数据库每天都用来存储越来越多的信息,因此这些也是每个Django项目中的关键组件。 因此了解它们的工作方式非常重要。当然,我无法解释
- 一、MySQL自带的压力测试工具——Mysqlslapmysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使
- 注:转载就注入出自'孤孤浪子博客'原创 http://itpro.blog.163.com 第一步 http://itpro
- 如题,度娘前几条答案说的都不清不楚,俺来补上:点击下拉选项中的Edit Configuration进入如下界面:如果左侧没有出现django
- 1、类变量、实例变量概念类变量:类变量就是定义在类中,但是在函数体之外的变量。通常不使用self.变量名赋值的变量。类变量通常不作为类的实例
- 1 减少HTTP请求数量 (Minimize HTTP Requests) tag:content80%的用户响应时间被花费在前端
- 文件内容:excel内容:代码:import xlrdimport jsonimport operatordef read_xlsx(fil
- ASP 错误代码 说明 ASP 0100 内存不足 ASP 0101 意外错误 ASP 0102 需要字符串输入 ASP 0103 需要数字
- 喜欢用 Python 做项目的小伙伴不免会遇到这种情况:做图表时,用哪种好看又实用的可视化工具包呢?之前文章里出现过漂亮的图表时,也总有读者
- 本文讨论 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型:MyISAM 和 Innodb,文中设计的 MySQL