如何让os.walk匹配列表字符串的父路径时停止递归,允许遍历同级目录
解决方案
要实现找到匹配目录后立即停止该路径的递归遍历,关键是在os.walk遍历过程中动态修改dirnames列表,控制哪些子目录需要继续递归。结合你的需求,正确的实现方式如下:
代码实现
import os my_list = ['zebra', 'giraffe'] target_paths = [] # 替换为你的根目录路径 root_dir = "./user" for dirpath, dirnames, filenames in os.walk(root_dir, topdown=True): current_dir_name = os.path.basename(dirpath) # 检查当前目录是否匹配条件 if any(x in current_dir_name for x in my_list): target_paths.append(dirpath) # 清空dirnames,停止递归当前目录的所有子目录 dirnames[:] = [] continue # 遍历子目录,找出匹配的并移除,避免递归 # 遍历dirnames的副本,防止修改原列表时影响遍历 for folder in list(dirnames): if any(x in folder for x in my_list): target_paths.append(os.path.join(dirpath, folder)) # 从dirnames中移除该文件夹,os.walk就不会递归进去 dirnames.remove(folder) # 输出结果 for path in target_paths: print(path)
代码说明
- 检查当前目录:每次进入一个目录,先判断目录名是否包含
my_list中的字符串,如果匹配,就将路径加入结果列表,然后清空dirnames,直接终止该目录下所有子目录的递归。 - 处理子目录:如果当前目录不匹配,就遍历子目录,找到匹配的子目录后,记录路径并从
dirnames中移除该子目录,这样os.walk就不会递归进入这个子目录的下一级。 - 效率提升:通过提前终止不必要的递归,避免了遍历庞大目录树中无关的子路径,大幅减少遍历时间。
运行结果
执行上述代码后,会直接输出你需要的目标路径:
./user/zebra ./user/giraffe ./user/lion/lion_01/giraffe_02
内容的提问来源于stack exchange,提问作者Bot75
相关产品推荐
相关产品推荐

