python批量修改xml

今天偶然需要修改一下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()

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容