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学习之asyncore模块用法实例教程
Sep 29 Python
Python操作列表之List.insert()方法的使用
May 20 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
python之Socket网络编程详解
Sep 29 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
Dec 04 Python
详解Django的MVT设计模式
Apr 29 Python
详解Python中的for循环
Apr 30 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
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
为jQuery增加join方法的实现代码
2010/11/28 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
Node.js学习入门
2017/01/03 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
python读取Excel表格文件的方法
2019/09/02 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
Python 如何查找特定类型文件
2020/08/17 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
最新教师自我评价分享
2013/11/12 职场文书
领班岗位职责范文
2014/02/06 职场文书
财务科科长岗位职责
2014/03/10 职场文书
商业融资计划书
2014/04/29 职场文书
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS