python批量修改xml

作者: 少寨主的互联网洞察 | 来源:发表于2018-04-17 22:11 被阅读770次

今天偶然需要修改一下Imglabel生成的xml说明文档。
xml内容大体如下:

<annotation>
    <folder>train</folder>
    <filename>img0000.jpg</filename>
    <path>E:/Project_dir/yolo_v2/darknet/build/darknet/x64/img/img0000.jpg</path>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>269</width>
        <height>187</height>
        <depth>3</depth>
    </size>  
    <segmented>0</segmented>
    <object>
        <name>butterfly</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>42</xmin>
            <ymin>66</ymin>
            <xmax>228</xmax>
            <ymax>151</ymax>
        </bndbox>
    </object>
</annotation>

我需要对其中的<path></path>标签里面的内容更改一下,于是想着使用python脚本来批量改一下,毕竟xml文档数目有些多。
这其中踩了不少的坑,在此记录一下。
首先我按照这篇博文进行改动尝试。我大体根据下面的代码进行更改:

#修改  
    n0.firstChild.data='circle'  
    p0.firstChild.data='ok' 

其中先抛开python2与python3的区别不说,这个不是什么大问题,可是当我执行完xml文档居然一点改动都没有!why?
后进行了一番其他尝试后,找到了这个指导给出了如下demo:

>>> from xml.etree.ElementTree import parse, Element
>>> doc = parse('pred.xml')
>>> root = doc.getroot()
>>> root
<Element 'stop' at 0x100770cb0>

>>> # Remove a few elements
>>> root.remove(root.find('sri'))
>>> root.remove(root.find('cr'))
>>> # Insert a new element after <nm>...</nm>
>>> root.getchildren().index(root.find('nm'))
1
>>> e = Element('spam')
>>> e.text = 'This is a test'
>>> root.insert(2, e)

>>> # Write back to a file
>>> doc.write('newpred.xml', xml_declaration=True)
>>>

大致懂了,按照这个再来一下,结果发现xml还是没动。
反省一下,为什么没有改动,说明是不是我没有写入磁盘,再去看看,应该是这个问题,改完后再跑,bingo!成功!
代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os  
import os.path
from xml.etree.ElementTree import parse, Element

def test():
    path="E:/Project_dir/yolo_v2/darknet/build/darknet/x64/xml/"  
    files=os.listdir(path)  #得到文件夹下所有文件名称  
    s=[]  
    for xmlFile in files: #遍历文件夹  
        if not os.path.isdir(xmlFile): #判断是否是文件夹,不是文件夹才打开  
            print xmlFile  
            pass
        path="E:/Project_dir/yolo_v2/darknet/build/darknet/x64/xml/"
        newStr=os.path.join(path,xmlFile)  
        dom=parse(newStr)  ###最核心的部分,路径拼接,输入的是具体路径  
        root=dom.getroot()
        #print root
        part=xmlFile[0:7]
        part1=part+'.jpg'
        newStr1='E:/Project_dir/yolo_v2/darknet/build/darknet/x64/img/'+part1
        
        #root.remove(root.find('path'))
        
        #e=Element('path')
        #print root.find('path').text
        root.find('path').text=newStr1
        #print newStr
        #path[0]=newStr
        #n1[0:57]="E:/Project_dir/yolo_v2/darknet/build/darknet/x64/img/"
        # p0.firstChild.data='ok'  
        # #打印输出  
        print 'path after change'  
        #print n0.firstChild.data  
      
        # print '修改后的 pose'  
        # print p0.firstChild.data  
        # print '~~~~~'  
        dom.write(newStr, xml_declaration=True)
        pass


if __name__=='__main__':
    test()

有很多注释的语句,基本没用,懒得删了,就这样吧

相关文章

  • python批量修改xml

    今天偶然需要修改一下Imglabel生成的xml说明文档。xml内容大体如下: 我需要对其中的 标签里面的内容更...

  • 批量添加 修改

    批量添加 ---dao层 ----------mapper.xml 批量修改 ----dao层 ---------...

  • 安卓批量签名工具使用说明

    安卓批量签名工具使用Python编写,利用此工具对未签名apk实现修改AndroidManifest.xml的多个...

  • python 批量修改文件名

    python 批量修改文件名

  • MyBatis动态SQL

    根据条件动态查询 和 批量修改 Emp EmpDao EmpMapper.xml index.html updat...

  • 2019-07-01 Python 一些应用

    批量修改类前缀 批量修改MD5 批量压缩图片 目前我接触到的python,主要用于批处理,因为其语言特性,十分迅速...

  • MySQL 批量操作

    1.批量添加 sql xml mapper 2.批量更新 xml mapper 3.批量删除 xml mapper

  • 利用python批量修改文件名

    最近比较苦恼批量修改文件的名字,文件名字还要根据表格对应进行修改,最近刚接触python,所以想到利用python...

  • mybatis批量更新update

    数据库连接配置需修改成支持批量操作增加: &allowMultiQueries=true mapper.xml中s...

  • Python改写maven的pom.xml文件

    前阵子工作中用Python对xml格式的配置文件的内容进行修改,使用的模块是Python内置的xml.etree....

网友评论

    本文标题:python批量修改xml

    本文链接:https://www.haomeiwen.com/subject/ejfmkftx.html