如何在循环中集成tqdm进度条并解决重复输出多个进度条问题
问题原因
tqdm实例嵌套在os.walk的循环内,os.walk每进入一个子目录就会生成一个新的tqdm进度条,遍历多少个目录就会输出多少条进度条,因此出现大量重复的进度条内容。
解决方案1:先收集全量文件再初始化进度条(最简便)
提前把所有要处理的文件路径收集到一个列表里,再用tqdm包裹这个列表迭代,全程只会生成一个进度条:
from tqdm import tqdm from time import sleep import os all_files = [] # 第一步先收集所有文件路径 for root, dirs, files in os.walk(myFile): for file in files: all_files.append(os.path.join(root, file)) # 第二步迭代所有文件,只初始化一次tqdm for item in tqdm(all_files, total=len(all_files)): sleep(0.01) # 后续业务逻辑,直接处理item即可
解决方案2:手动更新进度(适合文件量极大的场景)
只初始化一次tqdm实例,每处理完一个文件就手动更新进度,不需要提前收集所有文件占用内存:
from tqdm import tqdm from time import sleep import os totalFiles = 0 # 先统计总文件数 for base, dirs, files in os.walk(myFile): totalFiles += len(files) # 全局只初始化一次tqdm with tqdm(total=totalFiles) as pbar: for root, dirs, files in os.walk(myFile): for item in files: sleep(0.01) # 后续业务逻辑 pbar.update(1) # 每处理一个文件更新一次进度
内容的提问来源于stack exchange,提问作者Pelide
相关产品推荐
相关产品推荐

