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

9 投票
2 回答
4942 浏览
提问于 2025-04-18 01:44

我有一个文件夹的路径,我需要获取这个文件夹下所有的子文件夹,并且这些子文件夹里面不能再有其他子文件夹。

举个例子,如果我的文件夹结构是这样的:

-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 个回答

4

使用 os.walk 和列表推导式:

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

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

这个方法之所以有效,是因为 os.walk 会遍历所有的文件夹,把每个文件夹依次设置为 root。你想知道某个文件夹是不是最底层的文件夹吗?这就意味着它里面没有其他的文件夹,所以如果这个 rootdirs 是空的,就把它放到一个收集器里。

如果你还想跳过空的最底层文件夹,可以这样做:

    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']

撰写回答