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实现Tab自动补全和历史命令管理的方法
Mar 12 Python
用Python实现一个简单的能够上传下载的HTTP服务器
May 05 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
Python 如何展开嵌套的序列
Aug 01 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
python爬取天气数据的实例详解
Nov 20 Python
Python中过滤字符串列表的方法
Dec 22 Python
python制作抽奖程序代码详解
Jan 15 Python
Python自动化测试基础必备知识点总结
Feb 07 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的memcached客户端memcached
2011/06/14 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
Javascript 解疑
2009/11/11 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
vue实现登录功能
2020/12/31 Vue.js
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python中使用中文的方法
2011/02/19 Python
Python中的getopt函数使用详解
2015/07/28 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
Intersport西班牙:在线体育商店
2019/11/06 全球购物
项目建议书格式
2014/03/12 职场文书
募捐倡议书
2014/04/14 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
十八大宣传标语
2014/10/09 职场文书
工程部经理岗位职责
2015/02/02 职场文书
教师师德表现自我评价
2015/03/05 职场文书
教师培训简讯
2015/07/20 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL