查看有错误的标签名及修改

# -*- coding: UTF-8 -*-
import os
import os.path
import shutil
from xml.etree.ElementTree import parse, Element
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

def changeName(xml_fold, origin_name, new_name):
    '''
    xml_fold: xml存放文件夹
    origin_name: 原始名字,比如弄错的名字,原先要cow,不小心打成cwo
    new_name: 需要改成的正确的名字,在上个例子中就是cow
    '''
    files = os.listdir(xml_fold)
    cnt = 0
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text # 修改类名的
            # tmp_name = obj.find('difficult').text # 修改difficult 修改truncated
            if tmp_name == origin_name: # 修改
                obj.find('name').text = new_name
                # obj.find('difficult').text = new_name
                print("change %s to %s." % (origin_name, new_name))
                cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

def changeAll(xml_fold,new_name):
    '''
    xml_fold: xml存放文件夹
    new_name: 需要改成的正确的名字,在上个例子中就是cow,把所有类别改为1个类别
    '''
    files = os.listdir(xml_fold)
    cnt = 0
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            obj.find('name').text = new_name
            print("change %s to %s." % (tmp_name, new_name))
            cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

def countAll(xml_fold):
    '''
    xml_fold: xml存放文件夹
    '''
    files = os.listdir(xml_fold)
    dict={}
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
              
            if tmp_name not in dict:
                dict[tmp_name] = 0
            else:
                dict[tmp_name] += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("统计结果如下:")
    print("-"*10)
    for key,value in dict.items():
        print("类别为%s的目标个数为%d." % (key, value+1)) 

    print("-"*10)

def movexml(xml_fold,img_fold, newpath):
    '''
    xml_fold: xml存放文件夹
    '''
    files = os.listdir(xml_fold)
    
    dict={}
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = ET.ElementTree(file=file_path) 
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
        if tmp_name =='person':
            shutil.move(file_path, newpath)#保存到指定文件 
            shutil.move(os.path.join(img_fold,xmlFile[:-4]+'.jpg'),newpath) 
           
            # if tmp_name not in dict:
            #     dict[tmp_name] = 0
            # else:
            #     dict[tmp_name] += 1
        # dom.write(file_path, xml_declaration=True)#保存到指定文件
    
    print("-"*10)
    print("移动完成:")
 
    print("-"*10)

def removexml(origin_ann_dir,new_ann_dir ):#批量删除不需要的标签类以及空文件
    # origin_ann_dir = 'Annos/'# 设置原始标签路径为 Annos
    # new_ann_dir = 'Annotations/'# 设置新标签路径 Annotations
    for dirpaths, dirnames, filenames in os.walk(origin_ann_dir):# os.walk游走遍历目录名
        for filename in filenames:
            print(filename)
            if os.path.isfile(r'%s%s' %(origin_ann_dir, filename)):#获取原始xml文件绝对路径,isfile()检测是否为文件 isdir检测是否为目录
                origin_ann_path = os.path.join(r'%s%s' %(origin_ann_dir, filename))#如果是,获取绝对路径(重复代码)
                new_ann_path = os.path.join(r'%s%s' %(new_ann_dir, filename))#
                tree = ET.parse(origin_ann_path)#ET是一个xml文件解析库,ET.parse()打开xml文件。parse--"解析"
                root = tree.getroot()#获取根节点
                for object in root.findall('object'):#找到根节点下所有“object”节点
                    name = str(object.find('name').text)#找到object节点下name子节点的值(字符串),判断:如果不是列出的,(这里可以用in对保留列表成员进行审查),则移除该object节点及其所有子节点。
                    print(name)
                    if not (name in ["jyz_tc_bs"]):
                        root.remove(object)
                flag = 0#清楚非保留完成-标志位0
                tree.write(new_ann_path)#tree为文件,write写入新的文件中。
                for object in root.findall('object'):#找到根节点下所有子节点
                    name = str(object.find('name').text)#找到子节点中name变量,判断:如果每一个都是要保留的,则标志位变1,这是一个审查。
                    if (name in ["jyz_tc_bs"]):
                        flag = 1
                if (flag == 0):
                    os.remove(new_ann_path)#所有不满足审查:有多余object,则用os.remove(filepath)删除指定文件。




if __name__ == '__main__':
    path = r'E:\liufangtao\image\jyzps188\xmls\\' #xml文件所在的目录
    # imgpath = r'U:\voc2012\VOCdevkit\people\images'
    newpath = r'E:\liufangtao\image\jyzps188\b\\'#新文件夹
    # changeName(path, "jyz_bl_ps", "jyz_tc_ps")
    # changeAll(path, "difficultfuse") #谨慎使用
    # countAll(path)
    # movexml(path, imgpath,newpath)
    # countAll(path)#统计
    removexml(path,newpath)#批量删除不需要的标签类以及空文件
'''类别为jyz_tc_ps的目标个数为6667.
类别为jyz_tc_bs的目标个数为8171.
类别为jyz_fh的目标个数为2952.
类别为jyz_bl_ps的目标个数为684.
类别为jyz_tc_xs的目标个数为453.'''

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕容洛凝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值