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获取某年中每个月的第一天和最后一天
Dec 15 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
实例讲解python中的协程
Oct 08 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
python添加菜单图文讲解
Jun 04 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
Jun 30 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
Python用来做Web开发的优势有哪些
Aug 05 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
分享一个python的aes加密代码
Dec 22 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
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
php实现可逆加密的方法
2015/08/11 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
Js基础学习资料
2010/11/23 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
婚纱摄影师求职信范文
2014/04/17 职场文书
英文产品推荐信
2015/03/27 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python