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

今天分享一个我自己写的实用脚本,主要是将.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\")
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容