小编典典

如何在 Python 中获取所有直接子目录

all

我正在尝试编写一个简单的 Python 脚本,它将 index.tpl 复制到所有子目录中的 index.html (有一些例外)。

我试图获取子目录列表而陷入困境。


阅读 64

收藏
2022-07-09

共1个答案

小编典典

我对各种函数进行了一些 速度测试 ,以返回所有当前子目录的 完整路径。

tl;博士: 始终使用scandir

list_subfolders_with_paths = [f.path for f in os.scandir(path) if f.is_dir()]

奖励:scandir你也可以简单地通过使用f.name而不是获取文件夹名称f.path

这(以及下面的所有其他功能)将不使用 自然排序。这意味着结果将按如下方式排序:1、10、2。要获得自然排序(1、2、10)


结果scandir是:比walk快 3 倍,比listdir(使用过滤器)快 32 倍,比 快 35 倍,比
Pathlib36 倍,比 快listdir37 倍(!)glob

Scandir:           0.977
Walk:              3.011
Listdir (filter): 31.288
Pathlib:          34.075
Listdir:          35.501
Glob:             36.277

使用 W7x64、Python 3.8.1 测试。包含 440 个子文件夹的文件夹。
如果您想知道是否listdir可以通过不执行两次 os.path.join() 来加快速度,是的,但是基本上不存在差异。

代码:

import os
import pathlib
import timeit
import glob

path = r"<example_path>"



def a():
    list_subfolders_with_paths = [f.path for f in os.scandir(path) if f.is_dir()]
    # print(len(list_subfolders_with_paths))


def b():
    list_subfolders_with_paths = [os.path.join(path, f) for f in os.listdir(path) if os.path.isdir(os.path.join(path, f))]
    # print(len(list_subfolders_with_paths))


def c():
    list_subfolders_with_paths = []
    for root, dirs, files in os.walk(path):
        for dir in dirs:
            list_subfolders_with_paths.append( os.path.join(root, dir) )
        break
    # print(len(list_subfolders_with_paths))


def d():
    list_subfolders_with_paths = glob.glob(path + '/*/')
    # print(len(list_subfolders_with_paths))


def e():
    list_subfolders_with_paths = list(filter(os.path.isdir, [os.path.join(path, f) for f in os.listdir(path)]))
    # print(len(list(list_subfolders_with_paths)))


def f():
    p = pathlib.Path(path)
    list_subfolders_with_paths = [x for x in p.iterdir() if x.is_dir()]
    # print(len(list_subfolders_with_paths))



print(f"Scandir:          {timeit.timeit(a, number=1000):.3f}")
print(f"Listdir:          {timeit.timeit(b, number=1000):.3f}")
print(f"Walk:             {timeit.timeit(c, number=1000):.3f}")
print(f"Glob:             {timeit.timeit(d, number=1000):.3f}")
print(f"Listdir (filter): {timeit.timeit(e, number=1000):.3f}")
print(f"Pathlib:          {timeit.timeit(f, number=1000):.3f}")
2022-07-09