Python實(shí)現(xiàn)批量修改xml文件的腳本
今天分享一個(gè)我自己寫(xiě)的實(shí)用腳本,主要是將.xml文件進(jìn)行批量的修改
首先,聲明我并不是很了解.xml的相關(guān)知識(shí),所以今天主要是以我遇到的問(wèn)題來(lái)做個(gè)記錄。
想要更多的了解xml,請(qǐng)看最后的資料分享。
效果展示:
因?yàn)檫@些是屬于我們項(xiàng)目小組的,我也不清楚是不是有什么不能公開(kāi)的,我就截取了一小部分,原本是用lambelme來(lái)修改的,但由于xml文件似乎讀不進(jìn)去,所以只有手動(dòng)修改,將water改為blue(重要的是一個(gè)一個(gè)用記事本打開(kāi),手動(dòng)修改),這時(shí)候我的第一生產(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): # 判斷是否是文件夾,不是文件夾才打開(kāi) dom = md.parse(os.path.join(path,xmlFile)) root = dom.documentElement names = root.getElementsByTagName('name') #對(duì)某個(gè)標(biāo)簽進(jìn)行修改 # 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('夏天是冰紅茶的文件成功寫(xiě)入') #使用時(shí),請(qǐng)不要?jiǎng)h除這段 if __name__ == '__main__': main()
我說(shuō)一下問(wèn)題,因?yàn)樾〗M的其他師兄有用中文路徑,就會(huì)發(fā)生下面的情況:
但是記事本打開(kāi)是正常的,也已經(jīng)修改成功了。
我查了,是因?yàn)榫幋a的問(wèn)題,可以把XML文件的格式用記事本另存為ANSI就可以了(我不知道怎么另存為,可以看到記事本里面的編碼格式是ANSI,所以我覺(jué)得這個(gè)方法是行得通的),還可以將第一行修改為
<?xml version="1.0" encoding="GBK"?>
這種我是成功了。(別建議我打馬賽克)下次組會(huì),我一定要提這個(gè)問(wèn)題,以前因?yàn)槁窂街杏兄形某粤撕芏嗵?,所以我現(xiàn)在建工程都是盡量去用英文。
補(bǔ)充
除了上文的方法,小編還為大家整理了Python修改xml文件的其他方法,需要的可以參考一下
批量修改xml文件中指定位置內(nèi)容
我要修改圖片的絕對(duì)路徑
#!/usr/bin/python ''' 此文件用于整理網(wǎng)絡(luò)上搜集的數(shù)據(jù)集的xml文件,整理后方便用于訓(xùn)練。 ''' import os #文件操作相關(guān) import xml.etree.ElementTree as ET #xml文件操作相關(guān) """ "******************************************************************************************* *函數(shù)功能 : *輸入?yún)?shù) :輸入裁剪后圖像, *返 回 值 :無(wú) *編寫(xiě)時(shí)間 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整個(gè)文件夾所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夾包含的文件或文件夾的名字的列表。 num = len(total_xml) # xml文件個(gè)數(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標(biāo)簽, #print(obj) path_text = obj.text #print(path_text) end = "\\" string2 = path_text[path_text.rfind(end):] # 在strint1中查找最后一個(gè)正斜杠/后面的字符,圖片名稱 #print(string2) path_text_1=string1+string2 #print("path_text_1:",path_text_1) obj.text = path_text_1 # 修改標(biāo)簽內(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文件,整理后方便用于訓(xùn)練。 ''' import os #文件操作相關(guān) import xml.etree.ElementTree as ET #xml文件操作相關(guān) """ "******************************************************************************************* *函數(shù)功能 : *輸入?yún)?shù) :輸入裁剪后圖像, *返 回 值 :無(wú) *編寫(xiě)時(shí)間 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整個(gè)文件夾所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夾包含的文件或文件夾的名字的列表。 num = len(total_xml) # xml文件個(gè)數(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標(biāo)簽, #print(obj) path_text = obj.text #print(path_text) #end = "." end = "." string3 = path_text[path_text.rfind(end):] # 在strint1中查找最后一個(gè)反斜杠\后面的字符,圖片名稱 #print("string3:", string3) end = "." #string4 = string3[string3.rfind(end):] # 在strint1中查找最后一個(gè)正斜杠/后面的字符,圖片名稱 #print("string4:", string4) #print("xmlfile:", xmlfile) #print("string1:", string1) end = "." string2 = xmlfile[:xmlfile.rfind(end)] # 在strint1中查找最后一個(gè)正斜杠/后面的字符,圖片名稱 #print("string2:", string2) path_text_1 = string1 + string2+string3 #print("path_text_1:",path_text_1) obj.text = path_text_1 # 修改標(biāo)簽內(nèi)容 #tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 obj_2 = root.find('filename') # 找到filename標(biāo)簽 #print("obj_2:", obj_2) path_text_2= string2+string3 #print("path_text_2:", path_text_2) obj_2.text = path_text_2 # 修改標(biāo)簽內(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文件,整理后方便用于訓(xùn)練。 ''' 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ù) :輸入裁剪后圖像, *返 回 值 :無(wú) *編寫(xiě)時(shí)間 : 2021.7.12 *作 者 : diyun ********************************************************************************************""" # 批量修改整個(gè)文件夾所有的xml文件 def change_all_xml(xmlfilepath,string1): total_xml = os.listdir(xmlfilepath) # 用于返回指定的文件夾包含的文件或文件夾的名字的列表。 num = len(total_xml) # xml文件個(gè)數(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標(biāo)簽, #print(obj) path_text = obj.text #print(path_text) #end = "." end = "." string3 = path_text[path_text.rfind(end):] # 在strint1中查找最后一個(gè)反斜杠\后面的字符,圖片名稱 #print("string3:", string3) end = "." #string4 = string3[string3.rfind(end):] # 在strint1中查找最后一個(gè)正斜杠/后面的字符,圖片名稱 #print("string4:", string4) #print("xmlfile:", xmlfile) #print("string1:", string1) end = "." string2 = xmlfile[:xmlfile.rfind(end)] # 在strint1中查找最后一個(gè)正斜杠/后面的字符,圖片名稱 #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 # 修改標(biāo)簽內(nèi)容 #tree.write('%s/%s' % (xmlfilepath, xmlfile)) # 保存修改 obj_2 = root.find('filename') # 找到filename標(biāo)簽 # path_text_2= string2+string3 # obj_2.text = path_text_2 # 修改標(biāo)簽內(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實(shí)現(xiàn)批量修改xml文件的腳本的文章就介紹到這了,更多相關(guān)Python批量修改xml文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能完整實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)基于多線程、多用戶的FTP服務(wù)器與客戶端功能,結(jié)合完整實(shí)例形式分析了Python多線程、多用戶FTP服務(wù)器端與客戶端相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-08-08Python多線程模塊Threading用法示例小結(jié)
這篇文章主要介紹了Python多線程模塊Threading用法,結(jié)合實(shí)例形式分析了Python多線程模塊Threading相關(guān)概念、原理、進(jìn)程與線程的區(qū)別及使用技巧,需要的朋友可以參考下2019-11-11快速進(jìn)修Python指南之面向?qū)ο筮M(jìn)階
這篇文章主要為大家介紹了Java開(kāi)發(fā)者快速進(jìn)修Python指南之面向?qū)ο筮M(jìn)階,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Django DRF APIView源碼運(yùn)行流程詳解
這篇文章主要介紹了Django DRF APIView源碼運(yùn)行流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08代碼詳解django中數(shù)據(jù)庫(kù)設(shè)置
在本篇文章里小編給大家分享了關(guān)于django中數(shù)據(jù)庫(kù)設(shè)置的相關(guān)實(shí)例內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。2019-01-01python中re模塊知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python中re模塊知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼
在電腦上或多或少的存在一些重復(fù)文件,體積小的倒沒(méi)什么,如果體積大的就很占內(nèi)存了。本文用python制作了一個(gè)刪除重復(fù)文件的小工具,核心代碼很簡(jiǎn)單,希望對(duì)你有所幫助2022-07-07一個(gè)Python優(yōu)雅的數(shù)據(jù)分塊方法詳解
在做需求過(guò)程中有一個(gè)對(duì)大量數(shù)據(jù)分塊處理的場(chǎng)景,具體來(lái)說(shuō)就是幾十萬(wàn)量級(jí)的數(shù)據(jù),分批處理,每次處理100個(gè)。這時(shí)就需要一個(gè)分塊功能的代碼。本文為大家分享了一個(gè)Python中優(yōu)雅的數(shù)據(jù)分塊方法,需要的可以參考一下2022-05-05