如何用os.walk/pathlib筛选CR2/CR3文件并实现分批处理?
解决方案:用pathlib高效筛选RAW文件并分批处理
一、用pathlib替代os.walk筛选目标文件
pathlib的rglob()方法可以递归遍历所有文件,结合后缀判断就能精准筛选CR2/CR3(含大小写)的文件,同时能轻松处理目录筛选条件:
from pathlib import Path # 初始化根目录路径 root_path = Path(cfg.RAWIMG_DIR) # 先筛选出名称大于'10'的子目录并排序 valid_dirs = sorted([d for d in root_path.iterdir() if d.is_dir() and d.name > '10']) # 收集符合条件的文件 target_files = [] for dir_path in valid_dirs: # 递归遍历目录下所有文件,筛选后缀含'cr'的(不区分大小写) for file_path in dir_path.rglob('*'): if file_path.is_file() and 'cr' in file_path.suffix.lower(): target_files.append(file_path)
如果想节省内存,也可以用生成器直接迭代,避免一次性加载所有文件路径:
valid_files = ( file_path for dir_path in sorted(d for d in root_path.iterdir() if d.is_dir() and d.name > '10') for file_path in dir_path.rglob('*') if file_path.is_file() and 'cr' in file_path.suffix.lower() )
二、分批处理文件
按每10个一批拆分文件列表,提供两种实现方式:
方式1:列表切片(适合文件总数不大的场景)
batch_size = 10 for i in range(0, len(target_files), batch_size): batch = target_files[i:i+batch_size] # 执行当前批次的处理逻辑 print(f"处理第{i//batch_size +1}批,共{len(batch)}个文件") for file in batch: # 你的文件处理代码 pass
方式2:生成器分批(适合超大文件列表,节省内存)
def batch_generator(items, batch_size): batch = [] for item in items: batch.append(item) if len(batch) == batch_size: yield batch batch = [] if batch: yield batch # 用生成器分批迭代文件 for batch in batch_generator(valid_files, 10): print(f"处理一批,共{len(batch)}个文件") for file in batch: # 你的文件处理代码 pass
三、获取目录名称列表
如果需要单独提取符合条件的目录名称或路径,直接从之前的valid_dirs中获取即可:
# 获取目录名称列表 valid_dir_names = [d.name for d in valid_dirs] # 获取目录完整路径列表 valid_dir_paths = [str(d) for d in valid_dirs]
补充说明
原代码中的if dir > '10'应为笔误,这里默认是筛选**目录名称大于'10'**的子目录;若你需要筛选路径中某一层级的目录满足条件,可调整d.name为对应层级的判断逻辑。
内容的提问来源于stack exchange,提问作者user16971617
相关产品推荐
相关产品推荐

