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写日志封装类实例
Jun 28 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
Python  unittest单元测试框架的使用
Sep 08 Python
Python 忽略warning的输出方法
Oct 18 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
使用python爬取抖音视频列表信息
Jul 15 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
python程序文件扩展名知识点详解
Feb 27 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
Oct 21 Python
Pytorch可视化的几种实现方法
Jun 10 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
德生PL330测评
2021/03/02 无线电
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
Python基于twisted实现简单的web服务器
2014/09/29 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
python爬虫基本知识
2018/03/05 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
python程序控制NAO机器人行走
2019/04/29 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
python字符串格式化方式解析
2019/10/19 Python
Python tkinter模版代码实例
2020/02/05 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
捐助贫困学生倡议书
2014/05/16 职场文书
禁止酒驾标语
2014/06/25 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书