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使用urllib2获取网络资源实例讲解
Dec 02 Python
Python函数返回值实例分析
Jun 08 Python
Python3中详解fabfile的编写
Jun 24 Python
pygame实现雷电游戏雏形开发
Nov 20 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
numpy linalg模块的具体使用方法
May 26 Python
Python实现简单的列表冒泡排序和反转列表操作示例
Jul 10 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 Python
python 多态 协议 鸭子类型详解
Nov 27 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教程 变量定义
2009/10/23 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
jQuery拖动图片删除示例
2013/05/10 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
js使用递归解析xml
2014/12/12 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python制作豆瓣图片的爬虫
2017/12/28 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
Python中property函数用法实例分析
2018/06/04 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
python装饰器原理与用法深入详解
2019/12/19 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
python判断是空的实例分享
2020/07/06 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
社区学习十八大感想
2014/01/22 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
十佳护士获奖感言
2014/02/18 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
大学团日活动总结书
2015/05/11 职场文书
公司处罚决定书
2015/06/24 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
IDEA中sout快捷键无效问题的解决方法
2022/07/23 Java/Android