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正则表达式中的括号匹配问题
Dec 14 Python
Python3读取文件常用方法实例分析
May 22 Python
Python无损音乐搜索引擎实现代码
Feb 02 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 Python
python支付宝支付示例详解
Aug 22 Python
Django 自动生成api接口文档教程
Nov 19 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
Python之基础函数案例详解
Aug 30 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
执行iframe中的javascript方法
2008/10/07 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python实现感知器算法(批处理)
2019/01/18 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
纯css3实现走马灯效果
2014/12/26 HTML / CSS
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
前处理班长职位说明书
2014/03/01 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
销售工作决心书
2015/02/04 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
JavaScript实例 ODO List分析
2022/01/22 Javascript
详解Golang如何优雅的终止一个服务
2022/03/21 Golang