首頁 > 軟體

Python實現批次修改xml檔案的指令碼

2022-11-05 14:01:05

今天分享一個我自己寫的實用指令碼,主要是將.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檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com