电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python批量修改xml屬性的實現(xiàn)方式

瀏覽:41日期:2022-08-03 17:07:34

今天來說說xml那些事兒.如何批量修改指定文件夾下的xml文件的指定屬性.分三步走,首先,我們先看看如何讀寫單個

的xml文件;第二步,來看看如何遍歷指定文件夾下的所有文件,獲取到所有文件的文件名;第三步,我們來看看一二之間

該如何銜接.好,lets do it

step1:對單個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-8import xml.dom.minidom #打開xml文檔dom=xml.dom.minidom.parse(’test.xml’) #得到文檔元素對象root=dom.documentElementprint root.nodeNameprint root.nodeValueprint root.nodeTypeprint root.ELEMENT_NODE #1.獲取maxid 這一node名字(沒有屬性值),如何獲取里面的文本?bb=root.getElementsByTagName(’maxid’)b=bb[0]print b.nodeName #2.獲取login 這一node名字及相關(guān)屬性值login=root.getElementsByTagName(’login’)login=login[0] #獲取login的相關(guān)屬性值un=login.getAttribute('username')print unpd=login.getAttribute('passwd')print pd#修改先關(guān)屬性值 #3.獲取節(jié)點名為item的相關(guān)屬性值item=root.getElementsByTagName(’item’) #獲取了所有名字為item的nodeitem=item[0] #拿到第一個item,獲取相關(guān)屬性值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-8import 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.datan1=name[1]print n1.firstChild.data p0=pose[0]print p0.firstChild.datap1=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.dataprint n1.firstChild.dataprint ’修改后的 pose’print p0.firstChild.dataprint p1.firstChild.data

好了,現(xiàn)在我們學(xué)會了如何對單個文件進行修改,那么多個文件呢?

step2:遍歷指定路徑下的文件:

#coding=utf-8import osimport os.pathimport 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)是這樣的:

python批量修改xml屬性的實現(xiàn)方式

看到?jīng)],看到這個的話就說明我們已經(jīng)成功一半了!!!接下來我們把之前寫的讀取單個xml文件的代碼放進去

#coding=utf-8import osimport os.pathimport 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

直接運行,報錯!!我...

不要急,我們一點點來解決,,遇到問題是很正常的嘛!!!首先我們看看遇到什么錯?

python批量修改xml屬性的實現(xiàn)方式

打印除了000001.xml但是在實際讀取的時候出錯了!!還說找不到在這個文件?why??仔細想想發(fā)現(xiàn),這里可能要傳入的是

每個xml文件的具體路徑,有了這個想法之后我們再來看看:

這個時候就設(shè)涉及到Python路徑拼接的知識了:

path='/home/nvidia/xmlReader/xml/'xmlFile也是幾個字符串os.path.join(path,xmlFile)#os.path.join('/home/test','test.xml')

那么,我們就拼接好了.然后就執(zhí)行看看:

python批量修改xml屬性的實現(xiàn)方式

啊哈?!居然對了!!哈哈哈,大功告成!接下來就是先將圖像分好類,然后就可以批量修改文件了

python批量修改xml屬性的實現(xiàn)方式

好了,讓我們開看看最終的代碼:

#coding=utf-8import osimport os.pathimport 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文件夾匹配同名但不同格式的文件,然后將他們單獨

拎出來,復(fù)制到C文件夾保存,具體該怎么做呢?下一篇博客即將揭曉,拭目以待.

******************2018.1.27更新*******************

上面說的方法基于我們已經(jīng)知道了xml文件中有幾個pose屬性幾個object屬性,但是一般在修改之前我們是不知道的,那么如何自動的去識別并修改每個屬性的值呢?接下來我們開看看

這里要用到一個重要的關(guān)系:Python中的迭代(不同于c++/C,不能寫成for i in len(object))而要寫成

for i in range(len(pose)):print pose[i].firstChild.data

這樣的話,即使我們不知道有幾處要修改的地方,但是我們都能夠找出來,修改掉(這里每個pose都修改成同樣的屬性)

修改后,還需要保存到xml文件,修改后的代碼為:

#coding=utf-8import osimport os.pathimport 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內(nèi)容的編碼。# dom.writexml(fh,indent=’’,addindent=’t’,newl=’n’,encoding=’UTF-8’)# print(’寫入xml OK!’)

以上這篇python批量修改xml屬性的實現(xiàn)方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 智能交通网_智能交通系统_ITS_交通监控_卫星导航_智能交通行业 | Boden齿轮油泵-ketai齿轮泵-yuken油研-无锡新立液压有限公司 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 开锐教育-学历提升-职称评定-职业资格培训-积分入户 | 台湾HIWIN上银直线模组|导轨滑块|TBI滚珠丝杆丝杠-深圳汉工 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 针焰试验仪,灼热丝试验仪,漏电起痕试验仪,水平垂直燃烧试验仪 - 苏州亚诺天下仪器有限公司 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 环氧树脂地坪_防静电地坪漆_环氧地坪漆涂料厂家-地壹涂料地坪漆 环球电气之家-中国专业电气电子产品行业服务网站! | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 广东青藤环境科技有限公司-水质检测 | 派财经_聚焦数字经济内容服务平台 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 高中学习网-高考生信息学习必备平台 | 丁基胶边来料加工,医用活塞边角料加工,异戊二烯橡胶边来料加工-河北盛唐橡胶制品有限公司 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 新材料分散-高速均质搅拌机-超声波分散混合-上海化烁智能设备有限公司 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | ★塑料拖链__工程拖链__电缆拖链__钢制拖链 - 【上海闵彬】 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 淘剧影院_海量最新电视剧,免费高清电影随心观看 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 注塑_注塑加工_注塑模具_塑胶模具_注塑加工厂家_深圳环科 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 深圳市源和塑胶电子有限公司-首页| 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 |