You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:55:18