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

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

被labelimg框图逼疯的我,参考了好久的资料,含泪写下了这个批量处理标签的文件,废话不多说了,直接上货。

一、待处理的xml文件内容

<annotation>
  <folder>JPEGImagesfolder>
  <filename>0037filename>
  <path>H:\labelImg-master\windows_v1.2.2\data\voc\VOCdevkit\VOC2019\JPEGImages\0037.jpgpath>
  <source>
    <database>Unknowndatabase>
  source>
  <size>
    <width>413width>
    <height>347height>
    <depth>3depth>
  size>
  <segmented>0segmented>
  <object>
    <name>name>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>156xmin>
      <ymin>161ymin>
      <xmax>171xmax>
      <ymax>189ymax>
    bndbox>
  object>
  <object>
    <name>Aname>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>170xmin>
      <ymin>161ymin>
      <xmax>185xmax>
      <ymax>191ymax>
    bndbox>
  object>
  <object>
    <name>2name>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>189xmin>
      <ymin>161ymin>
      <xmax>204xmax>
      <ymax>191ymax>
    bndbox>
  object>
  <object>
    <name>7name>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>203xmin>
      <ymin>162ymin>
      <xmax>217xmax>
      <ymax>189ymax>
    bndbox>
  object>
  <object>
    <name>0name>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>217xmin>
      <ymin>162ymin>
      <xmax>229xmax>
      <ymax>188ymax>
    bndbox>
  object>
  <object>
    <name>3name>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>230xmin>
      <ymin>163ymin>
      <xmax>245xmax>
      <ymax>190ymax>
    bndbox>
  object>
  <object>
    <name>Qname>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>243xmin>
      <ymin>164ymin>
      <xmax>258xmax>
      <ymax>191ymax>
    bndbox>
  object>
  <object>
    <name>platename>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>137xmin>
      <ymin>145ymin>
      <xmax>277xmax>
      <ymax>208ymax>
    bndbox>
  object>
annotation>

二、需要修改的地方

  <folder>JPEGImagesfolder>
  <filename>0037filename>
  <path>H:\labelImg-master\windows_v1.2.2\data\voc\VOCdevkit\VOC2019\JPEGImages\0037.jpgpath>
  <object>
    <name>platename>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>137xmin>
      <ymin>145ymin>
      <xmax>277xmax>
      <ymax>208ymax>
    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>picfolder>
  <filename>466.jpgfilename>
  <path>F:\ai_models\REALCP-position-20201124\pic\466.jpgpath>
  <source>
    <database>Unknowndatabase>source>
  <size>
    <width>310width>
    <height>239height>
    <depth>"3"depth>size>
  <segmented>0segmented>
  <object>
    <name>pbname>
    <pose>Unspecifiedpose>
    <truncated>0truncated>
    <difficult>0difficult>
    <bndbox>
      <xmin>68xmin>
      <ymin>62ymin>
      <xmax>248xmax>
      <ymax>179ymax>bndbox>object>
  annotation>

总结

在这期间我也学习了一写批量处理文件重命名、批量复制文件的方法:
方法一:进入某个文件夹,Ctrl+A选中所有文件,右键首个文件,重命名后,按下F2功能键完成所有文件按照数字递增模式重命名,但是这种方法批量重命名后面会有个括号,那怎么去掉括号呢?别着急,下面送上解决方案:去除批量重命名中的括号
方法二:这个方法采用DOS命令和表格处理的方法实现批量重命名,这对于游客来说,感觉就很“高大上”了,不多说,写到这儿了我不想在打字了,直接上网址啦:DOS命令实现批量重命名
方法三:对于复制指定内容时,可以使用方法二中的方法获得所有文件名,然后继续通过DOS指令实现批量复制,指令很简单,易理解易学:DOS命令实现批量复制指定文件

你可能感兴趣的:(python,xml)