[解決済み] 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}")
関連
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] バイトを文字列に変換する
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] XMLを解析して、特定のノード属性のインスタンスをカウントするには?
-
[解決済み】カレントディレクトリの全サブディレクトリのリストを取得する
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python Decorator 練習問題
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] Pythonでディレクトリツリーのリストアップ
-
[解決済み】カレントディレクトリの全サブディレクトリのリストを取得する
-
[解決済み] os.listdir() による非英数字のリストオーダー