Python递归遍历目录时如何跳过指定子目录以提升效率?
递归扫描目录并跳过指定子目录的优化方案
问题背景
文件系统目录结构如下:
folder_to_scan/ important_file_a important_file_b important_folder_a/ important_file_c important_folder_b/ important_file_d useless_folder/ ...
需求是递归扫描folder_to_scan/获取所有文件名,但要忽略useless_folder/及其下所有内容。
原代码实现:
path_to_search = Path("folder_to_scan") [pth for pth in path_to_search.rglob("*") if pth.is_file() and 'useless_folder' not in [parent.name for parent in pth.parents]]
该方案的问题是:rglob会遍历所有目录(包括useless_folder下的数百万文件),仅在最后过滤结果,导致耗时极长。需要实现真正跳过无用目录,不遍历其内容。
优化方案
方法1:使用os.walk手动控制遍历
os.walk允许修改dirs列表跳过指定目录,从根源上避免进入无用目录递归遍历:
import os from pathlib import Path target_dir = "folder_to_scan" skip_dir = "useless_folder" file_paths = [] for root, dirs, files in os.walk(target_dir): # 移除要跳过的目录,阻止后续递归进入 if skip_dir in dirs: dirs.remove(skip_dir) # 收集当前目录下的所有文件路径 for file in files: file_paths.append(Path(root) / file)
方法2:用pathlib自定义递归遍历逻辑
自己实现递归扫描逻辑,遇到指定目录直接跳过,不继续遍历其子内容:
from pathlib import Path def scan_files(root: Path, skip_dir: str) -> list[Path]: file_list = [] for item in root.iterdir(): if item.is_file(): file_list.append(item) elif item.is_dir(): if item.name == skip_dir: continue # 跳过无用目录,不执行递归 file_list.extend(scan_files(item, skip_dir)) return file_list path_to_search = Path("folder_to_scan") result = scan_files(path_to_search, "useless_folder")
方案说明
两种方法的核心都是在遍历过程中直接跳过目标目录,而非先全量遍历再过滤,彻底避免了对useless_folder下大量文件的无效遍历,能大幅提升扫描效率。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

