我正在尝试编写一个简单的 Python 脚本,它将 index.tpl 复制到所有子目录中的 index.html (有一些例外)。
我试图获取子目录列表而陷入困境。
我对各种函数进行了一些 速度测试 ,以返回所有当前子目录的 完整路径。
tl;博士: 始终使用scandir:
scandir
list_subfolders_with_paths = [f.path for f in os.scandir(path) if f.is_dir()]
奖励:scandir你也可以简单地通过使用f.name而不是获取文件夹名称f.path。
f.name
f.path
这(以及下面的所有其他功能)将不使用 自然排序。这意味着结果将按如下方式排序:1、10、2。要获得自然排序(1、2、10)
结果 : scandir是:比walk快 3 倍,比listdir(使用过滤器)快 32 倍,比 快 35 倍,比 快Pathlib36 倍,比 快listdir37 倍(!)glob。
walk
listdir
Pathlib
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}")