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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
Python读取Excel的方法实例分析
Jul 11 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
Python中扩展包的安装方法详解
Jun 14 Python
python密码错误三次锁定(实例讲解)
Nov 14 Python
新手常见6种的python报错及解决方法
Mar 09 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
Pytorch环境搭建与基本语法
Jun 03 Python
python获取系统内存占用信息的实例方法
Jul 17 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
jquery实现轮播图特效
2020/04/12 jQuery
跟老齐学Python之模块的加载
2014/10/24 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
python标准库OS模块详解
2020/03/10 Python
《故乡》教学反思
2014/04/10 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
爱晚亭导游词
2015/02/09 职场文书
心理健康教育主题班会
2015/08/13 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
OpenCV实现反阈值二值化
2021/11/17 Java/Android