Python實現(xiàn)批量修改xml文件的腳本
今天分享一個我自己寫的實用腳本,主要是將.xml文件進行批量的修改
首先,聲明我并不是很了解.xml的相關(guān)知識,所以今天主要是以我遇到的問題來做個記錄。
想要更多的了解xml,請看最后的資料分享。
效果展示:
因為這些是屬于我們項目小組的,我也不清楚是不是有什么不能公開的,我就截取了一小部分,原本是用lambelme來修改的,但由于xml文件似乎讀不進去,所以只有手動修改,將water改為blue(重要的是一個一個用記事本打開,手動修改),這時候我的第一生產(chǎn)力產(chǎn)生了,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()
我說一下問題,因為小組的其他師兄有用中文路徑,就會發(fā)生下面的情況:
但是記事本打開是正常的,也已經(jīng)修改成功了。
我查了,是因為編碼的問題,可以把XML文件的格式用記事本另存為ANSI就可以了(我不知道怎么另存為,可以看到記事本里面的編碼格式是ANSI,所以我覺得這個方法是行得通的),還可以將第一行修改為
<?xml version="1.0" encoding="GBK"?>
這種我是成功了。(別建議我打馬賽克)下次組會,我一定要提這個問題,以前因為路徑中有中文吃了很多虧,所以我現(xiàn)在建工程都是盡量去用英文。
補充
除了上文的方法,小編還為大家整理了Python修改xml文件的其他方法,需要的可以參考一下
批量修改xml文件中指定位置內(nèi)容
我要修改圖片的絕對路徑
#!/usr/bin/python ''' 此文件用于整理網(wǎng)絡(luò)上搜集的數(shù)據(jù)集的xml文件,整理后方便用于訓練。 ''' import os #文件操作相關(guān) import xml.etree.ElementTree as ET #xml文件操作相關(guān) """ "******************************************************************************************* *函數(shù)功能 : *輸入?yún)?shù) :輸入裁剪后圖像, *返 回 值 :無 *編寫時間 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整個文件夾所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夾包含的文件或文件夾的名字的列表。 num = len(total_xml) # xml文件個數(shù) 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 # 修改標簽內(nèi)容 tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 xmlfilepath = 'helmet_xml' # xml文件保存地址 # 要修改的內(nèi)容 string1='E:\\1_Training_picture\\6_helmet\\helmet_train' change_all_xml(xmlfilepath,string1) print("ok")
修改path和filename
#!/usr/bin/python ''' 此文件用于整理網(wǎng)絡(luò)上搜集的數(shù)據(jù)集的xml文件,整理后方便用于訓練。 ''' import os #文件操作相關(guān) import xml.etree.ElementTree as ET #xml文件操作相關(guān) """ "******************************************************************************************* *函數(shù)功能 : *輸入?yún)?shù) :輸入裁剪后圖像, *返 回 值 :無 *編寫時間 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整個文件夾所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夾包含的文件或文件夾的名字的列表。 num = len(total_xml) # xml文件個數(shù) 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 # 修改標簽內(nèi)容 #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 # 修改標簽內(nèi)容 tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 #xmlfilepath = 'temp' # xml文件保存地址 xmlfilepath = 'helmet_xml' # xml文件保存地址 # 要修改的內(nèi)容 string1='E:\\1_Training_picture\\6_helmet\\helmet_train\\' change_all_xml(xmlfilepath,string1) print("ok")
最終版本
#!/usr/bin/python ''' 此文件用于整理網(wǎng)絡(luò)上搜集的數(shù)據(jù)集的xml文件,整理后方便用于訓練。 ''' import os #文件操作相關(guān) import xml.etree.ElementTree as ET #xml文件操作相關(guān) import cv2 #PRINT_FLAG=True PRINT_FLAG=False """ "******************************************************************************************* *函數(shù)功能 : *輸入?yún)?shù) :輸入裁剪后圖像, *返 回 值 :無 *編寫時間 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整個文件夾所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夾包含的文件或文件夾的名字的列表。 num = len(total_xml) # xml文件個數(shù) 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 # 修改標簽內(nèi)容 #tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 obj_2 = root.find('filename') # 找到filename標簽 # path_text_2= string2+string3 # obj_2.text = path_text_2 # 修改標簽內(nèi)容 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文件保存地址 # 要修改的內(nèi)容 string1='E:\\1_Training_picture\\6_helmet\\helmet_train\\' change_all_xml(xmlfilepath,string1) print("ok")
到此這篇關(guān)于Python實現(xiàn)批量修改xml文件的腳本的文章就介紹到這了,更多相關(guān)Python批量修改xml文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能完整實例
這篇文章主要介紹了Python實現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能,結(jié)合完整實例形式分析了Python多線程、多用戶FTP服務(wù)器端與客戶端相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下2017-08-08Python多線程模塊Threading用法示例小結(jié)
這篇文章主要介紹了Python多線程模塊Threading用法,結(jié)合實例形式分析了Python多線程模塊Threading相關(guān)概念、原理、進程與線程的區(qū)別及使用技巧,需要的朋友可以參考下2019-11-11代碼詳解django中數(shù)據(jù)庫設(shè)置
在本篇文章里小編給大家分享了關(guān)于django中數(shù)據(jù)庫設(shè)置的相關(guān)實例內(nèi)容,有興趣的朋友們跟著學習下。2019-01-01一個Python優(yōu)雅的數(shù)據(jù)分塊方法詳解
在做需求過程中有一個對大量數(shù)據(jù)分塊處理的場景,具體來說就是幾十萬量級的數(shù)據(jù),分批處理,每次處理100個。這時就需要一個分塊功能的代碼。本文為大家分享了一個Python中優(yōu)雅的數(shù)據(jù)分塊方法,需要的可以參考一下2022-05-05