批量修改xml文件下某个标签内容/文件存储路径

批量修改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>&#20113;</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命令实现批量复制指定文件

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值