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 相关文章推荐
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
python3 发送任意文件邮件的实例
Jan 23 Python
Python 实现网页自动截图的示例讲解
May 17 Python
python微信撤回监测代码
Apr 29 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
python 寻找离散序列极值点的方法
Jul 10 Python
python redis连接 有序集合去重的代码
Aug 04 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
Python如何安装第三方模块
May 28 Python
Python类的继承super相关原理解析
Oct 22 Python
python3实现简单飞机大战
Nov 29 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禁止某ip或ip地址段访问的方法
2015/02/25 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
理解Javascript_10_对象模型
2010/10/16 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
Python文件去除注释的方法
2015/05/25 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
pycharm运行scrapy过程图解
2019/11/22 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
Python作用域与名字空间原理详解
2020/03/21 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
python tqdm库的使用
2020/11/30 Python
ASP.NET Core中的配置详解
2021/02/05 Python
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
书法培训心得体会
2014/01/05 职场文书
财务总监管理职责范文
2014/03/09 职场文书
公司晚会主持词
2014/03/22 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
贪污检举信范文
2015/03/02 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫