如何在Python的os.walk()中排除含win/$win的目录树
解决方案:递归遍历目录时忽略指定目录树
核心问题分析
你当前用continue只是跳过了当前目录的处理,但os.walk仍会继续遍历该目录的所有子目录,这就是无法忽略整个目录树的原因。要彻底跳过目标目录及其子树,需要修改os.walk的遍历目录列表,让它不再进入这些目录。
修正后的代码
import os def without_system_files(drive: str, lookup_name: str): print(f"Searching... {drive.title()}:\\", end="\r") # 设置topdown=True,允许修改dirs列表控制后续遍历范围 for cur_dir, dirs, files in os.walk(f"{drive}:\\", topdown=True): # 过滤掉包含"win"或"$win"的子目录(不区分大小写) # 用dirs[:]赋值,直接修改os.walk的遍历目录列表 dirs[:] = [ d for d in dirs if "win" not in d.lower() and "$win" not in d.lower() ] # 遍历当前目录下的文件 for file in files: # 用os.path.join安全拼接路径,避免手动处理分隔符的错误 file_path = os.path.join(cur_dir, file) # 检查文件名匹配且是文件 if lookup_name in file and os.path.isfile(file_path): print(f"Found file at: {file_path}")
关键修改说明
topdown=True的作用:当开启该参数时,os.walk会先处理当前目录,再处理子目录。此时修改dirs列表(必须用dirs[:]赋值,不能重新定义变量)会直接影响后续遍历,被移除的目录及其子树会被完全跳过。- 目录过滤逻辑:直接对当前目录的子目录列表进行筛选,只保留不包含目标关键词的目录,从根源上阻止
os.walk遍历不需要的目录树。 - 路径拼接优化:用
os.path.join替代手动拼接路径,适配不同系统的路径分隔符,避免因手动处理\导致的错误。 - 冗余代码移除:利用
os.walk返回的files列表,无需再调用os.listdir,简化代码逻辑。
原代码的其他问题修复
- 原代码
---HERE---处使用了未定义的path变量,改为直接对子目录名d进行判断,逻辑更准确。 - 移除了手动判断目录长度拼接路径的冗余逻辑,改用
os.path.join更可靠。
内容的提问来源于stack exchange,提问作者Oskar
相关产品推荐
相关产品推荐

