批量修改xml文件下某个标签内容/文件存储路径
被labelimg框图逼疯的我,参考了好久的资料,含泪写下了这个批量处理标签的文件,废话不多说了,直接上货。
一、待处理的xml文件内容
<annotation>
<folder>JPEGImages</folder>
<filename>0037</filename>
<path>H:\labelImg-master\windows_v1.2.2\data\voc\VOCdevkit\VOC2019\JPEGImages\0037.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>413</width>
<height>347</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>云</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>156</xmin>
<ymin>161</ymin>
<xmax>171</xmax>
<ymax>189</ymax>
</bndbox>
</object>
<object>
<name>A</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>170</xmin>
<ymin>161</ymin>
<xmax>185</xmax>
<ymax>191</ymax>
</bndbox>
</object>
<object>
<name>2</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>189</xmin>
<ymin>161</ymin>
<xmax>204</xmax>
<ymax>191</ymax>
</bndbox>
</object>
<object>
<name>7</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>203</xmin>
<ymin>162</ymin>
<xmax>217</xmax>
<ymax>189</ymax>
</bndbox>
</object>
<object>
<name>0</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>217</xmin>
<ymin>162</ymin>
<xmax>229</xmax>
<ymax>188</ymax>
</bndbox>
</object>
<object>
<name>3</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>230</xmin>
<ymin>163</ymin>
<xmax>245</xmax>
<ymax>190</ymax>
</bndbox>
</object>
<object>
<name>Q</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>243</xmin>
<ymin>164</ymin>
<xmax>258</xmax>
<ymax>191</ymax>
</bndbox>
</object>
<object>
<name>plate</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>137</xmin>
<ymin>145</ymin>
<xmax>277</xmax>
<ymax>208</ymax>
</bndbox>
</object>
</annotation>
二、需要修改的地方
<folder>JPEGImages</folder>
<filename>0037</filename>
<path>H:\labelImg-master\windows_v1.2.2\data\voc\VOCdevkit\VOC2019\JPEGImages\0037.jpg</path>
<object>
<name>plate</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>137</xmin>
<ymin>145</ymin>
<xmax>277</xmax>
<ymax>208</ymax>
</bndbox>
</object>
1、将folder标签内容"JPEGImages"改为"pic"
2、将path标签内容改为F:\ai_models\REALCP-position-20201124\pic\xxx
3、将filename标签内容"0037"改为path标签中的路径下最后的文件名xxx,两者要保持一致
4、将object标签下属性内容"name"的值"plate"改为"pb"
5、只保留name属性值为’pb’的object节点
三、实现代码
####################################################################################
'''
功能:1、保留、修改xml文件某标签内容
2、修改xml文件存放路径,文件名,照片来源等
3、本方法采用字符串方式解析打开,删除/保存xml文件
'''
####################################################################################
import xml.etree.ElementTree as ET
import os
def change_xml():
"""
功能: 1、保留、修改xml文件某标签内容
2、修改xml文件存放路径,文件名,照片来源等
3、本方法采用字符串方式解析打开,删除/保存xml文件
4、方法是在Windows系统下运行的,方法中的路径请根据不同系统自行更改
"""
path = "E:\\znashi\\" # xml文件存放路径
save_path = "F:\\ai_models\\REALCP-position-20201124\\xml\\" # 修改后的xml文件存放路径
imgpath = "F:\\ai_models\\REALCP-position-20201124\\pic\\" # 新的照片path路径
files = os.listdir(path) # 读取路径下所有文件名
for xmlFile in files:
if xmlFile.endswith('.xml'):
tree = ET.ElementTree(file=path + xmlFile) # 打开xml文件,送到tree解析
root = tree.getroot() # 得到文档元素对象
root[0].text = 'pic' # root[0].text是annotation下第一个子节点中内容,直接赋值替换文本内容
root[1].text = xmlFile
root[1].text = root[1].text.replace('xml','jpg') #修改根节点下的内容
# root[1].text = root[1].text.split('.')[0] #根据需求决定要不要文件名后缀
root[2].text = imgpath + xmlFile
for object in root.findall('object'):
name = object.find('name').text # 获取每一个object节点下name节点的内容
if name == 'plate':
object.find('name').text = str('pb') #修改指定标签的内容
else:
root.remove(object) # 删除除了name属性值为'plate'之外object节点的所有object节点
tree.write(save_path + xmlFile) # 替换后的内容保存在内存中需要将其写出
if __name__ =="__main__":
change_xml()
四、修改后的xml文件内容
<annotation>
<folder>pic</folder>
<filename>466.jpg</filename>
<path>F:\ai_models\REALCP-position-20201124\pic\466.jpg</path>
<source>
<database>Unknown</database></source>
<size>
<width>310</width>
<height>239</height>
<depth>"3"</depth></size>
<segmented>0</segmented>
<object>
<name>pb</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>68</xmin>
<ymin>62</ymin>
<xmax>248</xmax>
<ymax>179</ymax></bndbox></object>
</annotation>
总结
在这期间我也学习了一写批量处理文件重命名、批量复制文件的方法:
方法一:进入某个文件夹,Ctrl+A选中所有文件,右键首个文件,重命名后,按下F2功能键完成所有文件按照数字递增模式重命名,但是这种方法批量重命名后面会有个括号,那怎么去掉括号呢?别着急,下面送上解决方案:去除批量重命名中的括号
方法二:这个方法采用DOS命令和表格处理的方法实现批量重命名,这对于游客来说,感觉就很“高大上”了,不多说,写到这儿了我不想在打字了,直接上网址啦:DOS命令实现批量重命名
方法三:对于复制指定内容时,可以使用方法二中的方法获得所有文件名,然后继续通过DOS指令实现批量复制,指令很简单,易理解易学:DOS命令实现批量复制指定文件