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")

到此这篇关于Python实现批量修改xml文件的脚本的文章就介绍到这了,更多相关Python批量修改xml文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 分析如何在Python中解析和修改XML

    目录 一.什么是XML? 二.Python XML解析模块 2.1.xml.etree.ElementTree模块 2.2.xml.dom.minidom模块 一.什么是XML? XML代表可扩展标记语言.它在外观上类似于HTML,但XML用于数据表示,而HTML用于定义正在使用的数据.XML专门设计用于在客户端和服务器之间来回发送和接收数据.看看下面的例子: 例子: <? xml version ="1.0" encoding ="UTF-8" ?>

  • python批量修改xml文件中的信息

    目录 项目场景: 问题描述: 分析: 解决方案: 总结 项目场景: 在做目标检测时,重新进行标注会耗费大量的时间,如果能够批量对xml中的信息进行修改,那么将会节省大量的时间,接下来将详细介绍如何修改标注文件xml中的相关信息. 问题描述: 例如:当我有一批标注好的xml文件,文件格式如下图所示 : <?xml version='1.0' encoding='us-ascii'?> <annotation> <folder>VOC2012</folder>

  • python实现修改xml文件内容

    XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的.它主要用到的有可扩展标记语言.可扩展样式语言(XSL).XBRL和XPath等. 直接上代码,拿来就可用. 首先需要准备一个测试​​xml​​​文件,我这个文件名字为​​text.xml​​:

  • python批量修改xml属性的实现方式

    今天来说说xml那些事儿.如何批量修改指定文件夹下的xml文件的指定属性.分三步走,首先,我们先看看如何读写单个 的xml文件;第二步,来看看如何遍历指定文件夹下的所有文件,获取到所有文件的文件名;第三步,我们来看看一二之间 该如何衔接.好,lets do it step1:对单个xml文件进行读写 给定一个xml文件: <?xml version="1.0" encoding="utf-8"?> <catalog> <maxid>

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

    今天分享一个我自己写的实用脚本,主要是将.xml文件进行批量的修改 首先,声明我并不是很了解.xml的相关知识,所以今天主要是以我遇到的问题来做个记录. 想要更多的了解xml,请看最后的资料分享. 效果展示: 因为这些是属于我们项目小组的,我也不清楚是不是有什么不能公开的,我就截取了一小部分,原本是用lambelme来修改的,但由于xml文件似乎读不进去,所以只有手动修改,将water改为blue(重要的是一个一个用记事本打开,手动修改),这时候我的第一生产力产生了,because I am l

  • 使用python批量修改XML文件中图像的depth值

    最近刚刚接触深度学习,并尝试学习制作数据集,制作过程中发现了一个问题,现在跟大家分享一下.问题是这样的,在制作voc数据集时,我采集的是灰度图像,并已经用labelimg生成了每张图像对应的XML文件.训练时发现好多目标检测模型使用的训练集是彩色图像,因此特征提取网络的输入是m×m×3的维度的图像.所以我就想着把我采集的灰度图像的深度也改成3吧.批量修改了图像的深度后,发现XML中的depth也要由1改成3才行.如果重新对图像标注一遍生成XML文件的话太麻烦,所以就想用python批量处理一下.

  • Python批量修改xml的坐标值全部转为整数的实例代码

    发现一个有意思的现象,labelimg打开图片和xml标签时候,看不到标注好的框框,仔细查看了xml文件,没发现什么异常,后面试一下,才发现是不能识别xml里的坐标值有小数点的情况.只能四舍五入都转成整数. 如: <bndbox> <xmin>1404.35</xmin> <ymin>0</ymin> <xmax>1458.56</xmax> <ymax>111.96</ymax> </bnd

  • 利用Python如何批量修改数据库执行Sql文件

    前言 由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些重复性的劳动,所以打算用Python来批量执行sql 环境 版本:Python3.6 系统:MacOS IDE:PyCharm 第三方库:pymysql Show Code import pymysql host = 'xxx.65.9.191' username = 'root' passw

  • 对python修改xml文件的节点值方法详解

    这是我的xml文件结构 <?xml version='1.0' encoding='utf-8'?> <annotation> <folder>JPEGImages</folder> <filename>train_2018-05-08_1000.jpg</filename> <path>D:\all_data\2018-05-08\JPEGImages\train_2018-05-08_1000.jpg</path

  • Python实现批量自动整理文件

    为了实现这样的小工具,我们先设想有下面这些功能. 1.可以自定义整理某一个路径下面的所有需要被整理的文件.2.默认情况下,使用文件后缀作为同一种类文件的文件夹名称,有其他想法的小伙伴可自行扩展. 将使用到的python模块导入到代码块中. import os # 文件/文件夹应用操作 import shutil # 移动文件 import logging # 使用日志logging来打印日志 选择好需要整理的原始文件目录. 下面是整理完成后的效果图,根据文件类型对各种文件进行整理. 在代码块中加

  • Python实现批量修改文件名实例

    本文实例讲述了Python实现批量修改文件名的方法.分享给大家供大家参考.具体如下: 下载了评书<贺龙传奇>,文件名中却都含有xxx有声下载,用脚本将其去掉.脚本涉及os.rename重命名方法,str.partition方法使用, 及正则match,search方法区别 # encoding:utf-8 ## # 文件名如: # 贺龙传奇\d+[有声下吧www.ysx8.com].mp3 ## import os,re fs=os.listdir('单田芳_贺龙传奇') for f in f

随机推荐