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 23 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
使用Python压缩和解压缩zip文件的教程
May 06 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
python生成器与迭代器详解
Jan 01 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
python属于软件吗
Jun 18 Python
Python下使用Trackbar实现绘图板
Oct 27 Python
pandas针对excel处理的实现
Jan 15 Python
Python基础之进程详解
May 21 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
mysql5写入和读出乱码解决
2006/11/25 PHP
10个实用的PHP代码片段
2011/09/02 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
jquery offset函数应用实例
2012/11/14 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
破解安装Pycharm的方法
2018/10/19 Python
Python 处理图片像素点的实例
2019/01/08 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
在交互式环境中执行Python程序过程详解
2019/07/12 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
教学大赛获奖感言
2014/01/15 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
九年级化学教学反思
2014/01/28 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
运动会方阵口号
2014/06/07 职场文书
企业文化理念标语
2014/06/10 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
人大代表选举标语
2014/10/07 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
Java基础-封装和继承
2021/07/02 Java/Android