获取树中最低子目录的列表

时间:2014-04-07 17:49:27

标签: python os.walk

我有一个指向某个目录的路径,我需要获得一个列表,列出所有不包含任何子目录的子目录。

例如,如果我有以下树:

-father_dir:
    -son_dir1:
        -grandson.txt
    -son_dir2:
        -grandson_dir1:
            -greatgrandson1.txt

我想要一个包含以下内容的列表:[son_dir1, grandson_dir1]

我尝试过:我使用os.walk()获取father_dir中的所有子目录,现在我试图遍历每个子目录的内容(使用os.listdir())并查找它是否包含目录...到目前为止我还没有成功(因为os.listdir()没有给出目录的路径,而只是它的名称),此外,这似乎是一种非常麻烦的方法。

欢迎任何简单的解决方案。谢谢!

2 个答案:

答案 0 :(得分:8)

lowest_dirs = list()

for root,dirs,files in os.walk(starting_directory):
    if not dirs:
        lowest_dirs.append(root)

这是有效的,因为os.walk通过目录进行递归,依次将每个目录设置为root。您想知道它是否是最低级别的目录?这意味着它不包含其他目录,因此对于该根,如果dirs为空,则将其丢弃在累加器中。

如果您还想跳过EMPTY最低级别的文件夹,请执行以下操作:

    if files and not dirs:

如果您只想要尾部(文件夹名称,而不是整个路径),请使用:

        lowest_dirs.append(os.path.split(root)[-1])

测试它:

>>> lowest_dirs = list()
>>> toplevel = r"U:\User\adsmith\My Documents\dump\father_dir"
>>> for root,dirs,files in os.walk(toplevel):
...     if not dirs:
...         lowest_dirs.append(os.path.split(root)[-1])
>>> print(lowest_dirs)
['son_dir1', 'grandson_dir1']

答案 1 :(得分:3)

使用os.walk和列表理解:

[os.path.split(r)[-1] for r, d, f in os.walk(tree) if not d]