python实现的批量分析xml标签中各个类别个数功能示例


Posted in Python onDecember 30, 2019

本文实例讲述了python实现的批量分析xml标签中各个类别个数功能。分享给大家供大家参考,具体如下:

文章目录

需要个脚本分析下各个目标的数目 顺带练习下多进程,自用,直接上代码:

# -*- coding: utf-8 -*-
# @Time  : 2019/06/10 18:56
# @Author : TuanZhangSama
import os
import xml.etree.ElementTree as ET
from multiprocessing import Pool,freeze_support,cpu_count
import imghdr
import logging
def get_all_xml_path(xml_dir:str,filter=['.xml']):
  #遍历文件夹下所有xml
  result=[]
  #maindir是当前搜索的目录 subdir是当前目录下的文件夹名 file是目录下文件名
  for maindir,subdir,file_name_list in os.walk(xml_dir):
    for filename in file_name_list:
      ext=os.path.splitext(filename)[1]#返回扩展名
      if ext in filter:
        result.append(os.path.join(maindir,filename))
  return result
def analysis_xml(xml_path:str):
  tree=ET.parse(xml_path)
  root=tree.getroot()
  result_dict={}
  for obj in root.findall('object'):
    obj_name = obj.find('name').text
    obj_num=result_dict.get(obj_name,0)+1
    result_dict[obj_name]=obj_num
  if imghdr.what(xml_path.replace('.xml','.jpg')) != 'jpeg':
    print(xml_path.replace('.xml','.jpg'),'is worng')
    # logging.info(xml_path.replace('.xml','.jpg'))
  if is_valid_jpg(xml_path.replace('.xml','.jpg')):
    pass
  return result_dict
def analysis_xmls_batch(xmls_path_list:list):
  result_list=[]
  for i in xmls_path_list:
    result_list.append(analysis_xml(i))
  return result_list
def collect_result(result_list:list):
  all_result_dict={}
  for result_dict in result_list:
    for key,values in result_dict.items():
      obj_num=all_result_dict.get(key,0)+values
      all_result_dict[key]=obj_num
  return all_result_dict
def main(xml_dir:str,result_save_path:str =None):
  r'''根据xml文件统计所有样本的数目.对于文件不完整的图片和有xml但无图片的样本,直接进行删除.默认跑满所有的cpu核心
  Parameters
  ----------
  xml_dir : str
    xml所在的文件夹.用的递归形式,因此只需保证xml在此目录的子目录下即可.对应的图片和其xml要在同一目录
  result_save_path : str
    分析结果的日志保存路径.默认 None 无日志
  '''
  if result_save_path is not None:
    assert isinstance(result_save_path,str),'{} is illegal path'.format(result_save_path)
  else:
    logging.basicConfig(filename=result_save_path,filemode='w',level=logging.INFO)
  freeze_support()#windows 上用
  xmls_path=get_all_xml_path(xml_dir)
  worker_num=cpu_count()
  print('your CPU num is',cpu_count())
  length=float(len(xmls_path))/float(worker_num)
  #计算下标,尽可能均匀地划分输入文件的列表
  indices=[int(round(i*length)) for i in range(worker_num+1)]
  #生成每个进程要处理的子文件列表
  sublists=[xmls_path[indices[i]:indices[i+1]] for i in range(worker_num)]
  pool=Pool(processes=worker_num)
  all_process_result_list=[]
  for i in range(worker_num):
    all_process_result_list.append(pool.apply_async(analysis_xmls_batch,args=(sublists[i],)))
  pool.close()
  pool.join()
  print('analysis done!')
  _temp_list=[]
  for i in all_process_result_list:
    _temp_list=_temp_list+i.get()
  result=collect_result(_temp_list)
  logging.info(result)
  print(result)
def is_valid_jpg(jpg_file):
  """判断JPG文件下载是否完整   """
  if not os.path.exists(jpg_file):
    print(jpg_file,'is not existes')
    os.remove(jpg_file.replace('.jpg','.xml'))
  with open(jpg_file, 'rb') as fr:
    fr.seek(-2, 2)
    if fr.read() == b'\xff\xd9':
      return True
    else:
      os.remove(jpg_file)
      os.remove(jpg_file.replace('.jpg','.xml'))
      print(jpg_file)
      logging.error(jpg_file,'is imperfect img')
      return False
if __name__=='__main__':
  test_dir='/home/chiebotgpuhq/Share/winshare/origin'
  save_path='/home/chiebotgpuhq/MyCode/python/pytorch/mmdetection-master/result.log'
  main(test_dir,save_path)
Python 相关文章推荐
初步讲解Python中的元组概念
May 21 Python
Python出现segfault错误解决方法
Apr 16 Python
图文详解WinPE下安装Python
May 17 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
python时间time模块处理大全
Oct 25 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 #Python
python基于celery实现异步任务周期任务定时任务
Dec 30 #Python
Django框架之中间件MiddleWare的实现
Dec 30 #Python
Django 路由层URLconf的实现
Dec 30 #Python
python解析多层json操作示例
Dec 30 #Python
pytorch 求网络模型参数实例
Dec 30 #Python
利用python3 的pygame模块实现塔防游戏
Dec 30 #Python
You might like
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
各种常用浏览器getBoundingClientRect的解析
2009/05/21 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
python条件和循环的使用方法
2013/11/01 Python
Python出现segfault错误解决方法
2016/04/16 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python 文件转成16进制数组的实例
2018/07/09 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
英国最大的户外商店:Go Outdoors
2019/04/17 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
kfc实习自我鉴定
2013/12/14 职场文书
小学一年级评语大全
2014/04/22 职场文书
小小商店教学反思
2014/04/27 职场文书
个人安全生产承诺书
2014/05/22 职场文书
教师师德工作总结2015
2015/07/22 职场文书
初中政治教学反思
2016/02/23 职场文书
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle