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实现计算最小编辑距离
Mar 17 Python
python flask实现分页效果
Jun 27 Python
Python3 使用cookiejar管理cookie的方法
Dec 28 Python
python判断自身是否正在运行的方法
Aug 08 Python
Pytorch 实现权重初始化
Dec 31 Python
python json.dumps中文乱码问题解决
Apr 01 Python
linux 下selenium chrome使用详解
Apr 02 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
python实现简单猜单词游戏
Dec 24 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 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 获取完整url地址
2008/12/20 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
Python列表append和+的区别浅析
2015/02/02 Python
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
详解Python Socket网络编程
2016/01/05 Python
Python列表切片操作实例总结
2019/02/19 Python
int在python中的含义以及用法
2019/06/27 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
Python list和str互转的实现示例
2020/11/16 Python
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
Linux的主要特性
2014/10/06 面试题
公益活动邀请函
2014/02/05 职场文书
村干部培训方案
2014/05/02 职场文书
信息合作协议书
2014/10/09 职场文书
2014年保卫工作总结
2014/12/05 职场文书
2015年行政部工作总结
2015/04/28 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS