質問で尋ねられていないことに気づきましたが、隠しファイルと __
で始まるファイルの両方を除外したいという同様の問題がありました 、具体的には __pycache__
ディレクトリ。リストの理解が期待どおりに機能しない理由を理解しようとしていたため、この質問にたどり着きました。 dirnames[:]
でリストを変更していませんでした .
除外したいプレフィックスのリストを作成し、ディレクトリ名を次のように変更しました:
exclude_prefixes = ('__', '.') # exclusion prefixes
for dirpath, dirnames, filenames in os.walk(node):
# exclude all dirs starting with exclude_prefixes
dirnames[:] = [dirname
for dirname in dirnames
if not dirname.startswith(exclude_prefixes)]
私のユースケースは、特定のフォルダー内のサブディレクトリの総数を返したいという点を除いて、OP のユースケースと似ていました。私の場合、 .git
という名前のサブディレクトリを省略したかった (これらの .git
内にネストされている可能性のあるフォルダーと同様に フォルダ)
Python 3.6.7 では、受け入れられた回答のアプローチが機能しないことがわかりました。すべての .git
をカウントしました。 フォルダーとそのサブフォルダー。これが私にとってうまくいったことです:
num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
if '.git' in dirs:
dirs.remove('.git')
num_local_subdir += (len(dirs))
いいえ、os.walk()
のオプションはありません それはそれらをスキップします。自分で行う必要があります (これは簡単です):
for root, dirs, files in os.walk(path):
files = [f for f in files if not f[0] == '.']
dirs[:] = [d for d in dirs if not d[0] == '.']
# use files and dirs
dirs[:] =
に注意してください スライスの割り当て; os.walk
dirs
にリストされているサブディレクトリを再帰的にトラバースします . 要素を置き換えることによって dirs
の 基準を満たすもの (例:名前が .
で始まらないディレクトリ) )、os.walk()
基準を満たさないディレクトリにはアクセスしません。
これは、topdown
を保持している場合にのみ機能します True
へのキーワード引数 、 os.walk()
のドキュメントから :
topdown
のとき True
です 、呼び出し元は dirnames リストをインプレースで変更できます (おそらく del
を使用) またはスライス割り当て)、および walk()
名前が dirnames に残っているサブディレクトリにのみ再帰します;これは、検索を絞り込んだり、特定の訪問順序を強制したり、walk()
に通知したりするために使用できます。 呼び出し元が再開する前に作成または名前変更するディレクトリについて walk()