如何在遍历目录并条件加载文件的for循环中使用tqdm进度条?
解决tqdm在条件加载目录文件时的进度条问题
你遇到的核心问题是:当前代码会为每个子目录的文件列表单独生成一个tqdm进度条,导致输出一堆零散的进度条,没法直观看到整体的加载进度。下面给你两种实用的解决方案:
方案1:先收集所有目标文件再遍历(简单直观)
这种方法先把所有符合startswith('Test')条件的文件路径收集起来,再用tqdm统一遍历,进度条会准确显示整体进度:
import os from tqdm import tqdm loaddir = r'D:\Folder' print('Data load initiated') # 第一步:收集所有符合条件的文件路径 target_files = [] for subdir, _, files in os.walk(loaddir): # 筛选出以Test开头的文件,拼接完整路径 target_files.extend([os.path.join(subdir, name) for name in files if name.startswith('Test')]) # 第二步:用tqdm遍历处理文件 for file_path in tqdm(target_files, desc='Processing files'): # 在这里执行你的操作,比如读取文件、数据处理等 # 示例:with open(file_path, 'r') as f: ... pass
方案2:先统计总数再逐文件更新(适合大文件场景)
如果目标文件数量极大,提前收集列表会占用过多内存,可以先遍历一次统计符合条件的文件总数,再用tqdm的total参数和update方法来更新进度:
import os from tqdm import tqdm loaddir = r'D:\Folder' print('Data load initiated') # 第一步:统计符合条件的文件总数 total_files = 0 for subdir, _, files in os.walk(loaddir): total_files += sum(1 for name in files if name.startswith('Test')) # 第二步:初始化进度条并逐文件处理 with tqdm(total=total_files, desc='Processing files') as pbar: for subdir, _, files in os.walk(loaddir): for name in files: if name.startswith('Test'): file_path = os.path.join(subdir, name) # 执行你的操作 # 示例:process_data(file_path) pbar.update(1) # 每处理一个文件,进度条前进1格
为什么原来的代码会出问题?
你之前的代码在os.walk的每个子目录循环里,都给当前子目录的所有文件套了一个tqdm——这意味着每个子目录都会生成一个独立的进度条,不管里面有没有符合条件的文件,所以才会看到一堆零散的进度输出。
内容的提问来源于stack exchange,提问作者Red Sparrow
相关产品推荐
相关产品推荐

