47

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

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

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

4

3 に答える 3

106

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キーワード引数を に保持する場合にのみ機能します。Trueos.walk()

topdownisの場合True、呼び出し元は dirnames リストをその場で変更でき (おそらくdelまたは スライス代入を使用)、名前がdirnameswalk()に残っているサブディレクトリにのみ再帰します。これを使用して、検索を削除したり、特定の訪問順序を強制したり、呼び出し元が作成または名前変更したディレクトリについて通知したりしてから、再開することができます。walk()walk()

于 2012-11-19T12:54:02.693 に答える
13

__質問で尋ねられなかったことに気づきましたが、隠しファイルと で始まるファイル、特に__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)]
于 2014-08-11T15:24:15.340 に答える