使用os.walk遍历目录时如何仅输出一级子目录路径?
解决os.walk只输出指定深度目录的问题
嘿,我来帮你排查下问题所在~
你遇到的核心问题是注释掉了控制遍历深度的关键代码!咱们一步步来看:
原代码的问题
os.walk() 默认会递归遍历所有层级的子目录,所以会输出从根目录开始的所有深度路径,这就是为什么你会看到.git/info、refs/remotes/origin这类多级路径。
你的walklevel函数哪里错了
你写的walklevel函数里,把最关键的del dirs[:]判断逻辑注释掉了!这行代码的作用是:当遍历到指定深度时,清空当前目录的子目录列表,告诉os.walk()不要再继续往下遍历更深的层级。没有这行,os.walk还是会一路递归到底。
修正后的walklevel函数
把注释掉的代码恢复,就能实现只遍历到指定深度(这里level=1,也就是一级子目录):
import os def walklevel(some_dir, level=1): some_dir = some_dir.rstrip(os.path.sep) assert os.path.isdir(some_dir) # 统计初始目录的路径分隔符数量,用来判断当前深度 num_sep = some_dir.count(os.path.sep) for root, dirs, files in os.walk(some_dir): yield root, dirs, files num_sep_this = root.count(os.path.sep) # 当当前路径深度达到指定层级时,停止深入子目录 if num_sep + level <= num_sep_this: del dirs[:] print(root) rawsource = "/Users/user/project/CODE_BASE" list(walklevel(rawsource))
更简单的替代方案
如果你只是想获取CODE_BASE下的直接一级子目录,其实不用写遍历函数,直接用os.listdir()筛选更高效:
import os rawsource = "/Users/user/project/CODE_BASE" for item in os.listdir(rawsource): full_path = os.path.join(rawsource, item) if os.path.isdir(full_path): print(full_path)
这个方法直接列出当前目录下的所有条目,然后只保留目录类型的路径,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Jshee
相关产品推荐
相关产品推荐

