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之wxPython应用实例
Sep 28 Python
Python入门篇之编程习惯与特点
Oct 17 Python
在Django的视图(View)外使用Session的方法
Jul 23 Python
Python对列表中的各项进行关联详解
Aug 15 Python
python实现简单多人聊天室
Dec 11 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
解决Django加载静态资源失败的问题
Jul 28 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
Python如何实现强制数据类型转换
Nov 22 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 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连接MYSQL数据库实例代码
2016/01/20 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
js转换对象为xml
2017/02/17 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
pycharm 使用心得(四)显示行号
2014/06/05 Python
go语言计算两个时间的时间差方法
2015/03/13 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
python全局变量引用与修改过程解析
2020/01/07 Python
Python如何进行时间处理
2020/08/06 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
打架检讨书500字
2014/01/29 职场文书
逃课上网检讨书
2014/02/20 职场文书
劲霸男装广告词改编版
2014/03/21 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
青年教师个人总结
2015/02/11 职场文书
2015年科协工作总结
2015/05/19 职场文书
毕业赠语大全
2015/06/23 职场文书
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers