Python中无明确枚举器的循环如何使用Progressbar2展示进度
Progressbar2适配多层嵌套循环的实现方案
核心思路:提前统计所有需要处理的目标文件总数,手动控制进度条更新,不需要将进度条绑定到现有嵌套迭代器上
os.walk遍历文件元信息的速度远快于文件内容处理逻辑,额外加一次统计不会产生可感知的性能损耗,具体实现步骤如下:
1. 先统计总任务量
先遍历一次目标路径,统计所有非隐藏文件的总数,作为进度条的最大刻度:
import os import progressbar root_path = "some path" total_files = 0 # 首次遍历仅统计符合要求的文件总数 for path, dirs, files in os.walk(root_path): for filename in files: if not filename.startswith('.'): total_files += 1
2. 初始化进度条并改造原有循环
在原有业务逻辑不变的前提下,每完成一个文件的处理就更新一次进度条计数即可:
# 初始化进度条 pbar = progressbar.ProgressBar(maxval=total_files).start() processed_count = 0 # 保留你原有初始化的animalmapping、animalcontiglist变量 animalmapping = {} for path, dirs, files in os.walk(root_path): for filename in files: if not filename.startswith('.'): # 原有业务逻辑完全保留 assemblyfile = open(os.path.join(path,filename)).readlines() lineswithaccession = '' for lin in assemblyfile: if lin.startswith('>'): lineswithaccession += ' ' + lin for contig in animalcontiglist: if contig in lineswithaccession: if filename[:-3] not in animalmapping: animalmapping[filename[:-3]] = [] animalmapping[filename[:-3]].append(contig) # 处理完单个文件后更新进度 processed_count += 1 pbar.update(processed_count) # 全部任务完成后关闭进度条 pbar.finish()
可选的无总进度模式
如果不想额外做一次统计,也可以使用不确定进度模式,进度条会显示为循环滚动状态,只需修改初始化参数即可:
pbar = progressbar.ProgressBar(maxval=progressbar.UnknownLength).start()
内容的提问来源于stack exchange,提问作者user1995
相关产品推荐
相关产品推荐

