您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么在python中修改xml屬性,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
對單個xml文件進行讀寫
給定一個xml文件:
<?xml version="1.0" encoding="utf-8"?> <catalog> <maxid>4</maxid> <login username="pytest" passwd='123456'> <caption>Python</caption> <item id="4"> <caption>測試</caption> </item> </login> <item id="2"> <caption>Zope</caption> </item> </catalog>
來看看代碼,怎么讀取里面的屬性(大家先照著注釋理解一遍,有空我再來詳細說明)
#coding=utf-8 import xml.dom.minidom #打開xml文檔 dom=xml.dom.minidom.parse('test.xml') #得到文檔元素對象 root=dom.documentElement print root.nodeName print root.nodeValue print root.nodeType print root.ELEMENT_NODE #1.獲取maxid 這一node名字(沒有屬性值),如何獲取里面的文本? bb=root.getElementsByTagName('maxid') b=bb[0] print b.nodeName #2.獲取login 這一node名字及相關屬性值 login=root.getElementsByTagName('login') login=login[0] #獲取login的相關屬性值 un=login.getAttribute("username") print un pd=login.getAttribute("passwd") print pd #修改先關屬性值 #3.獲取節(jié)點名為item的相關屬性值 item=root.getElementsByTagName('item') #獲取了所有名字為item的node item=item[0] #拿到第一個item,獲取相關屬性值 i=item.getAttribute("id")#獲取id的值 print i #4.獲取標簽對之間的數(shù)據(jù),并修改為新的值 caption=root.getElementsByTagName('caption') c0=caption[0] print c0.firstChild.data #firstChild屬性返回被選節(jié)點的第一個子節(jié)點,.data表示獲取該節(jié)點數(shù)據(jù) c1=caption[1] print c1.firstChild.data c2=caption[2] #caption節(jié)點有三個!!! print c2.firstChild.data #修改標簽對之間的數(shù)據(jù),直接對節(jié)點數(shù)據(jù)賦值 c2.firstChild.data='dhhdlh' print c2.firstChild.data
好了,看完了demo,我們現(xiàn)在來實戰(zhàn)操練一番,使用通用的VOC2007標注數(shù)據(jù)集,xml文件長這個樣子:
<annotation verified="no"> <folder>row_img</folder> <filename>000002</filename> <path>/home/nvidia/labelImg-master/img_change/row_img/000002.jpg</path> <source> <database>Unknown</database> </source> <size> <width>1200</width> <height>800</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>qwe</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>513</xmin> <ymin>265</ymin> <xmax>921</xmax> <ymax>663</ymax> </bndbox> </object> <object> <name>wieoiwpe</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>513</xmin> <ymin>265</ymin> <xmax>921</xmax> <ymax>663</ymax> </bndbox> </object> </annotation>
那么,我們該如何修改呢?請看:
#coding=utf-8 import xml.dom.minidom ###批量讀取xml文件 ###讀取單個xml文件 dom=xml.dom.minidom.parse('000002.xml') root=dom.documentElement #獲取標簽對name/pose之間的值 name=root.getElementsByTagName('name') pose=root.getElementsByTagName('pose') #原始信息 print '原始信息' n0=name[0] print n0.firstChild.data n1=name[1] print n1.firstChild.data p0=pose[0] print p0.firstChild.data p1=pose[1] print p1.firstChild.data #修改標簽對之間的值 n0.firstChild.data='circle' n1.firstChild.data='circle' p0.firstChild.data='ok' p1.firstChild.data='ok' #打印輸出 print '修改后的 name' print n0.firstChild.data print n1.firstChild.data print '修改后的 pose' print p0.firstChild.data print p1.firstChild.data
好了,現(xiàn)在我們學會了如何對單個文件進行修改,那么多個文件呢?
step2:遍歷指定路徑下的文件:
#coding=utf-8 import os import os.path import xml.dom.minidom path="/home/nvidia/xmlReader/xml/" files=os.listdir(path) #得到文件夾下所有文件名稱 s=[] for xmlFile in files: #遍歷文件夾 if not os.path.isdir(xmlFile): #判斷是否是文件夾,不是文件夾才打開 print xmlFile
(path下我放的是幾個xml文件),打印xmlFile我們發(fā)現(xiàn)是這樣的:
看到?jīng)],看到這個的話就說明我們已經(jīng)成功一半了!!!接下來我們把之前寫的讀取單個xml文件的代碼放進去
#coding=utf-8 import os import os.path import xml.dom.minidom path="/home/nvidia/xmlReader/xml/" files=os.listdir(path) #得到文件夾下所有文件名稱 s=[] for xmlFile in files: #遍歷文件夾 if not os.path.isdir(xmlFile): #判斷是否是文件夾,不是文件夾才打開 print xmlFile #TODO #xml文件讀取操作 #將獲取的xml文件名送入到dom解析 dom=xml.dom.minidom.parse(xmlFile) root=dom.documentElement #獲取標簽對name/pose之間的值 name=root.getElementsByTagName('name') pose=root.getElementsByTagName('pose') #原始信息 print '原始信息' n0=name[0] print n0.firstChild.data n1=name[1] print n1.firstChild.data p0=pose[0] print p0.firstChild.data p1=pose[1] print p1.firstChild.data
直接運行,報錯!!我...
不要急,我們一點點來解決,,遇到問題是很正常的嘛!!!首先我們看看遇到什么錯?
打印除了000001.xml但是在實際讀取的時候出錯了!!還說找不到在這個文件?why??仔細想想發(fā)現(xiàn),這里可能要傳入的是
每個xml文件的具體路徑,有了這個想法之后我們再來看看:
這個時候就設涉及到Python路徑拼接的知識了:
path="/home/nvidia/xmlReader/xml/"
xmlFile也是幾個字符串
os.path.join(path,xmlFile)
#os.path.join("/home/test","test.xml")
那么,我們就拼接好了.然后就執(zhí)行看看:
啊哈?!居然對了!!哈哈哈,大功告成!接下來就是先將圖像分好類,然后就可以批量修改文件了
好了,讓我們開看看最終的代碼:
#coding=utf-8 import os import os.path import xml.dom.minidom path="/home/nvidia/xmlReader/xml/" files=os.listdir(path) #得到文件夾下所有文件名稱 s=[] for xmlFile in files: #遍歷文件夾 if not os.path.isdir(xmlFile): #判斷是否是文件夾,不是文件夾才打開 print xmlFile #TODO #xml文件讀取操作 #將獲取的xml文件名送入到dom解析 dom=xml.dom.minidom.parse(os.path.join(path,xmlFile)) ###最核心的部分,路徑拼接,輸入的是具體路徑 root=dom.documentElement #獲取標簽對name/pose之間的值 name=root.getElementsByTagName('name') pose=root.getElementsByTagName('pose') #原始信息 print '原始信息' n0=name[0] print n0.firstChild.data p0=pose[0] print p0.firstChild.data #修改 n0.firstChild.data='circle' p0.firstChild.data='ok' #打印輸出 print '修改后的 name' print n0.firstChild.data print '修改后的 pose' print p0.firstChild.data print '~~~~~'
其實,就我個人來講,還有個需求,就是文件匹配:根據(jù)A文件夾中的文件名,在B文件夾匹配同名但不同格式的文件,然后將他們單獨
拎出來,復制到C文件夾保存,具體該怎么做呢?下一篇博客即將揭曉,拭目以待.
******************2018.1.27更新*******************
上面說的方法基于我們已經(jīng)知道了xml文件中有幾個pose屬性幾個object屬性,但是一般在修改之前我們是不知道的,那么如何自動的去識別并修改每個屬性的值呢?接下來我們開看看
這里要用到一個重要的關系:Python中的迭代(不同于c++/C,不能寫成for i in len(object))而要寫成
for i in range(len(pose)):
print pose[i].firstChild.data
這樣的話,即使我們不知道有幾處要修改的地方,但是我們都能夠找出來,修改掉(這里每個pose都修改成同樣的屬性)
修改后,還需要保存到xml文件,修改后的代碼為:
#coding=utf-8 import os import os.path import xml.dom.minidom path="/home/nvidia/xmlReader/xml/" files=os.listdir(path) #得到文件夾下所有文件名稱 s=[] for xmlFile in files: #遍歷文件夾 if not os.path.isdir(xmlFile): #判斷是否是文件夾,不是文件夾才打開 print xmlFile #TODO #xml文件讀取操作 #將獲取的xml文件名送入到dom解析 dom=xml.dom.minidom.parse(os.path.join(path,xmlFile)) ###最核心的部分os.path.join(path,xmlFile),路徑拼接,輸入的是具體路徑 root=dom.documentElement #獲取標簽對name/pose之間的值 name=root.getElementsByTagName('name') pose=root.getElementsByTagName('pose') #重命名class name for i in range(len(name)): print name[i].firstChild.data name[i].firstChild.data='circle' print name[i].firstChild.data for j in range(len(pose)): print pose[j].firstChild.data pose[j].firstChild.data='ok' print pose[j].firstChild.data #保存修改到xml文件中 with open(os.path.join(path,xmlFile),'w') as fh: dom.writexml(fh) print('寫入name/pose OK!') # with open('dom_write.xml','w',encoding='UTF-8') as fh: # # 4.writexml()第一個參數(shù)是目標文件對象,第二個參數(shù)是根節(jié)點的縮進格式,第三個參數(shù)是其他子節(jié)點的縮進格式, # # 第四個參數(shù)制定了換行格式,第五個參數(shù)制定了xml內容的編碼。 # dom.writexml(fh,indent='',addindent='\t',newl='\n',encoding='UTF-8') # print('寫入xml OK!')
以上就是怎么在python中修改xml屬性,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。