1. ホーム
  2. python

[解決済み] Pythonで直下のサブディレクトリを全て取得する方法

2022-04-14 17:11:50

質問

私は、すべてのサブディレクトリのindex.tplをindex.htmlにコピーする簡単なPythonスクリプトを書こうとしています(いくつかの例外を除いて)。

サブディレクトリのリストを取得しようとして、つまづいています。

解決方法は?

私はいくつかの スピードテスト を返すための様々な関数で フルパス を現在のすべてのサブディレクトリにコピーします。

tl;dr: 常に scandir :

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

ボーナス scandir を使用すると、単純にフォルダ名だけを取得することもできます。 f.name の代わりに f.path .

これは (以下の他の関数も同様) ナチュラルソート . これは、結果がこのようにソートされることを意味します。自然なソート(1,2,10)を行うには、以下を参照してください。 https://stackoverflow.com/a/48030307/2441026






結果 : scandir です。3倍速い walk よりも32倍速い。 listdir (フィルタあり)、35倍速 Pathlib と36倍の速さで listdir と37倍(!)速くなりました。 glob .

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

W7x64、Python3.8.1でテストしました。440のサブフォルダを持つフォルダ。

と疑問に思う方のために listdir を2回実行しないことで、高速化できる可能性はありますが、基本的には違いはありません。

コードです。

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}")