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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
利用Python实现命令行版的火车票查看器
Aug 05 Python
Python进行数据提取的方法总结
Aug 22 Python
python僵尸进程产生的原因
Jul 21 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
对python判断ip是否可达的实例详解
Jan 31 Python
PyTorch基本数据类型(一)
May 22 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
pytorch锁死在dataloader(训练时卡死)
May 28 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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文件
2007/01/04 PHP
php实现图片缩放功能类
2013/12/18 PHP
PHP开发微信支付的代码分享
2014/05/25 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
Vue实现日历小插件
2019/06/26 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
python实现猜单词小游戏
2020/05/22 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
室内设计实习自我鉴定
2013/09/25 职场文书
个人实用简单的自我评价
2013/10/19 职场文书
出国留学介绍信
2014/01/13 职场文书
2014年元旦活动方案
2014/02/15 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
导游词之山海关
2019/12/10 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏
golang操作rocketmq的示例代码
2022/04/06 Golang
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电