web-dev-qa-db-ja.com

隠しフォルダなしのos.walk

フォルダ内のディレクトリパスを含むすべてのファイルを一覧表示する必要があります。私はos.walkを使おうとしましたが、これは明らかに完璧なソリューションです。

ただし、隠しフォルダとファイルも一覧表示されます。アプリケーションで非表示のフォルダーやファイルを一覧表示しないようにしたい。隠しファイルを生成しないようにするために使用できるフラグはありますか?

クロスプラットフォームは私にとってそれほど重要ではありません。それがLinux(。*パターン)でのみ機能する場合は問題ありません。

36
lolopop

いいえ、それらをスキップする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にリストされているサブディレクトリを再帰的に走査します。 dirselementsを基準を満たすもの(たとえば、名前が.で始まらないディレクトリ)に置き換えることにより、os.walk()は、基準を満たさないディレクトリにはアクセスしません。

documentation of os.walk() から、topdownキーワード引数をTrueに保持している場合にのみ機能します。

topdownTrueの場合、呼び出し元はdirnamesリストをインプレースで変更でき(おそらくdelまたはスライス割り当てを使用)、walk()は再帰のみを行いますdirnames;に名前が残っているサブディレクトリにこれは、検索を整理したり、特定の訪問順序を課したり、呼び出し側が作成したディレクトリや名前を変更したりする前にwalk()に通知したり、walk()を再開する前に使用したりできます。

84
Martijn Pieters

質問では尋ねられなかったことがわかりましたが、隠しファイルと__で始まるファイル、特に__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)]
10
dmmfll

私の使用例は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))
0
James Dellinger