本文实例讲述了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)

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

希望本文所述对大家Python程序设计有所帮助。

python 标签数量_python实现的批量分析xml标签中各个类别个数功能示例相关推荐

  1. python考勤记录_python连接中控考勤机分析数据

    用python连接中控考勤机. 下载并分析数据,把结果邮件给人事. SDK包建议用32位的,在win7 64位系统上用64位开发包不行,用32可以. python还要pywin32 注意版本,我这用的 ...

  2. python爬取网店数据_Python爬虫实现抓取京东店铺信息及下载图片功能示例

    本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requ ...

  3. python右键弹出菜单编写_python实现应用程序在右键菜单中添加打开方式功能

    最近项目组开发的一个小工具想要在右键菜单中添加打开方式,以有道云笔记为例进行了需求拆解和代码编写 1.需求拆解: 如何实现手动添加右键菜单的打开方式: Step1:打开注册表编辑器,Win+R-> ...

  4. python翻译器怎么用_Python使用百度翻译开发平台实现英文翻译为中文功能示例

    本文实例讲述了Python使用百度翻译开发平台实现英文翻译为中文功能.分享给大家供大家参考,具体如下: #coding=utf8 import random import requests impor ...

  5. 用 Python selenium爬取股票新闻并存入mysql数据库中带翻页功能demo可下载

    用 Python selenium爬取实时股票新闻并存入mysql数据库中 1.分析需求 2.创建表 3.分析需要爬取的网页内容 4.python里面selenium进行爬虫操作 1.添加包 2.连接 ...

  6. python编写计算器输入1或2代表+或x_Python实现两款计算器功能示例

    本文实例为大家分享了Python实现计算器功能示例代码,供大家参考,具体内容如下 1.简单计算器 #计算一个表达式的时候,首先肯定是先算括号里面的,再算乘除法,后算加减法 import re # 1. ...

  7. python共享内存通信mapofview_python map eval strPython socket模块实现的udp通信功能示例...

    本文实例讲述了Python socket模块实现的udp通信功能.分享给大家供大家参考,具体如下: socket介绍 socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要 ...

  8. python聚类分析如何确定分类个数_确定聚类分析中的类别个数的方法

    1.gap statistic 以k-means聚类为例,对于一个聚类个数k,首先利用k-means聚类将样本聚成k类,然后计算k类中各类内各点与类中心的距离加和W(ki),进而计算k类的距离加和W( ...

  9. python 数组升序_python简单数据清洗和分析

    利用python学习了简单一维数组和二维数组,明白了集合.数组.字典大概的关联,并学会从中点用不同的数组类型进行更好的分析. 读取excel文件,开始进行最简单的数据清洗. 将购药时间重新命名为销售时 ...

最新文章

  1. OpenCV——简易图形画法:画奥运五环
  2. 求解方程Ax=b的通用程序
  3. plsql存储过程修改后怎么保存_证件照上传不成功,教你修改分辨率、调整照片大小...
  4. CSS 编码中超级有用的工具集合
  5. 第三篇 Entity Framework Plus 之 Query Cache
  6. .mod.c 是什么文件
  7. Python问题3——爬虫编码问题
  8. 终于有人把赌徒谬误讲明白了
  9. objective-c宏定义
  10. 太原市初中计算机课程视频,初中全课程教学视频
  11. scala 判断字段 是不是 日期类型_举个栗子!Tableau 技巧(147):使用 动态参数 筛选到最新日期值...
  12. uva-10245-分治
  13. 让解析器可以快速处理词法单元之间的空格
  14. 机器学习精讲中7.1固定特征核中关于N维向量多项式特征映射的理解(二)
  15. EAS使用后台事务定时执行方法
  16. Vue.js 基础入门
  17. ubuntu18设置屏幕旋转_[Android6.0][MTK6737] 设置屏幕旋转 270 度
  18. spring-boot只logback日志打印
  19. smallworld 下的magik module 的logger和service provider
  20. 来自作业本的写给90后

热门文章

  1. 『TensorFlow』模型保存和载入方法汇总
  2. python网络编程2-黏包问题
  3. Jmeter Beanshell采样器调用JAVA方法(二)
  4. 【Liunx服务器】阿里云服务器下部署多个tomcat服务
  5. 手把手教你如何下载大厂页面的字体——开发
  6. Repeater嵌套Repeater获取父级绑定项
  7. Maven修改默认仓库为阿里云仓库
  8. Hibernate Query 的 list 和iterate方法缓存的区别
  9. 2016-5-31 问题及解决
  10. 使Tomcat可以下载中文文件