フォルダ内のディレクトリパスを含むすべてのファイルを一覧表示する必要があります。私はos.walk
を使おうとしましたが、これは明らかに完璧なソリューションです。
ただし、隠しフォルダとファイルも一覧表示されます。アプリケーションで非表示のフォルダーやファイルを一覧表示しないようにしたい。隠しファイルを生成しないようにするために使用できるフラグはありますか?
クロスプラットフォームは私にとってそれほど重要ではありません。それがLinux(。*パターン)でのみ機能する場合は問題ありません。
いいえ、それらをスキップする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
のelementsを基準を満たすもの(たとえば、名前が.
で始まらないディレクトリ)に置き換えることにより、os.walk()
は、基準を満たさないディレクトリにはアクセスしません。
documentation of os.walk()
から、topdown
キーワード引数をTrue
に保持している場合にのみ機能します。
topdown
がTrue
の場合、呼び出し元はdirnamesリストをインプレースで変更でき(おそらくdel
またはスライス割り当てを使用)、walk()
は再帰のみを行いますdirnames;に名前が残っているサブディレクトリにこれは、検索を整理したり、特定の訪問順序を課したり、呼び出し側が作成したディレクトリや名前を変更したりする前にwalk()
に通知したり、walk()
を再開する前に使用したりできます。
質問では尋ねられなかったことがわかりましたが、隠しファイルと__
で始まるファイル、特に__pycache__
ディレクトリの両方を除外したいという同様の問題がありました。私がこの質問にたどり着いたのは、リストの理解がなぜ期待したことをしていないのかを理解しようとしていたからです。 dirnames[:]
を使用して適切なリストを変更していませんでした。
除外したいプレフィックスのリストを作成し、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))