今天偶然需要修改一下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()
有很多注释的语句,基本没用,懒得删了,就这样吧
网友评论