python批量修改xml属性的实现方式


Posted in Python onMarch 05, 2020

今天来说说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-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.获取节点名为item的相关属性值
item=root.getElementsByTagName('item') #获取了所有名字为item的node
item=item[0] #拿到第一个item,获取相关属性值
i=item.getAttribute("id")#获取id的值
print i
 
#4.获取标签对之间的数据,并修改为新的值
caption=root.getElementsByTagName('caption')
c0=caption[0]
print c0.firstChild.data #firstChild属性返回被选节点的第一个子节点,.data表示获取该节点数据
 
c1=caption[1]
print c1.firstChild.data
 
c2=caption[2] #caption节点有三个!!!
print c2.firstChild.data
#修改标签对之间的数据,直接对节点数据赋值
c2.firstChild.data='dhhdlh'
print c2.firstChild.data

好了,看完了demo,我们现在来实战操练一番,使用通用的VOC2007标注数据集,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

好了,现在我们学会了如何对单个文件进行修改,那么多个文件呢?

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我们发现是这样的:

python批量修改xml属性的实现方式

看到没,看到这个的话就说明我们已经成功一半了!!!接下来我们把之前写的读取单个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

直接运行,报错!!我...

不要急,我们一点点来解决,,遇到问题是很正常的嘛!!!首先我们看看遇到什么错?

python批量修改xml属性的实现方式

打印除了000001.xml但是在实际读取的时候出错了!!还说找不到在这个文件?why??仔细想想发现,这里可能要传入的是

每个xml文件的具体路径,有了这个想法之后我们再来看看:

这个时候就设涉及到Python路径拼接的知识了:

path="/home/nvidia/xmlReader/xml/"
xmlFile也是几个字符串
os.path.join(path,xmlFile)
#os.path.join("/home/test","test.xml")

那么,我们就拼接好了.然后就执行看看:

python批量修改xml属性的实现方式

啊哈?!居然对了!!哈哈哈,大功告成!接下来就是先将图像分好类,然后就可以批量修改文件了

python批量修改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)) ###最核心的部分,路径拼接,输入的是具体路径
  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 '~~~~~'

其实,就我个人来讲,还有个需求,就是文件匹配:根据A文件夹中的文件名,在B文件夹匹配同名但不同格式的文件,然后将他们单独

拎出来,复制到C文件夹保存,具体该怎么做呢?下一篇博客即将揭晓,拭目以待.

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

上面说的方法基于我们已经知道了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()第一个参数是目标文件对象,第二个参数是根节点的缩进格式,第三个参数是其他子节点的缩进格式,
#    # 第四个参数制定了换行格式,第五个参数制定了xml内容的编码。
#    dom.writexml(fh,indent='',addindent='\t',newl='\n',encoding='UTF-8')
#    print('写入xml OK!')

以上这篇python批量修改xml属性的实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的石头剪子布代码分享
Aug 22 Python
python实现bucket排序算法实例分析
May 04 Python
Django Admin实现上传图片校验功能
Mar 06 Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 Python
python矩阵转换为一维数组的实例
Jun 05 Python
python实现随机漫步方法和原理
Jun 10 Python
python字符串Intern机制详解
Jul 01 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
Python sublime安装及配置过程详解
Jun 29 Python
python excel多行合并的方法
Dec 09 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 #Python
Python实现在Windows平台修改文件属性
Mar 05 #Python
Pycharm最常用的快捷键及使用技巧
Mar 05 #Python
Python 去除字符串中指定字符串
Mar 05 #Python
Python脚本去除文件的只读性操作
Mar 05 #Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 #Python
Python Handler处理器和自定义Opener原理详解
Mar 05 #Python
You might like
cmd下运行php脚本
2008/11/25 PHP
PHP 字符串分割和比较
2009/10/06 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
使用python获取电脑的磁盘信息方法
2018/11/01 Python
通过python爬虫赚钱的方法
2019/01/29 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
市场营销毕业生自荐信
2013/11/23 职场文书
上班早退检讨书
2014/01/09 职场文书
公司培训欢迎词
2014/01/10 职场文书
我爱我家教学反思
2014/05/01 职场文书
代领毕业证委托书
2014/08/02 职场文书
村委会贫困证明范本
2014/09/17 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python