使用os.walk遍历目录时如何仅获取一级子目录路径?
嘿,问题一眼就能看出来——你把walklevel函数里阻止os.walk深入到更深层级的核心代码给注释掉了!
为什么你的代码会打印多级路径?
os.walk的工作逻辑是:每遍历到一个目录,就会根据dirs列表里的内容去递归遍历下一级子目录。如果你想要限制遍历深度,必须修改dirs列表——清空它(del dirs[:])就能让os.walk停止继续往下走。你现在把这段判断和清空的代码注释掉了,os.walk自然会老老实实遍历所有深度的目录。
修正后的完整代码
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) # 当当前路径的层级达到指定深度时,清空dirs阻止继续遍历下层 if num_sep + level <= num_sep_this: del dirs[:] print(root) # 调用测试 rawsource = "/Users/user/project/CODE_BASE" list(walklevel(rawsource))
关键逻辑解释
- 初始目录
/Users/user/project/CODE_BASE的路径分隔符/数量是4 - 当遍历到它的一级子目录(比如
/Users/user/project/CODE_BASE/website)时,分隔符数量变成5,刚好等于num_sep + level(4+1) - 这时候执行
del dirs[:],os.walk就不会再去遍历这个子目录下的.git等深层路径了
这样修改后,你只会得到初始目录本身,以及它的直接一级子目录,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Jshee
相关产品推荐
相关产品推荐

