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删除文本中行数标签的方法
May 31 Python
python实现诗歌游戏(类继承)
Feb 26 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
python中有关时间日期格式转换问题
Dec 25 Python
python logging设置level失败的解决方法
Feb 19 Python
Python运行异常管理解决方案
Mar 09 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
浅谈Python类的单继承相关知识
May 12 Python
微信小程序调用python模型
Apr 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
php自动注册登录验证机制实现代码
2011/12/20 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
浅析Python中signal包的使用
2015/11/13 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
"引用"与多态的关系
2013/02/01 面试题
项目考察欢迎辞
2014/01/17 职场文书
师德师风个人反思
2014/04/28 职场文书
听课评语大全
2014/04/30 职场文书
2014年实习期工作总结
2014/11/27 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
子女赡养老人协议书
2016/03/23 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB