GNU/Linux >> Linux の 問題 >  >> Linux

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

質問で尋ねられていないことに気づきましたが、隠しファイルと __ で始まるファイルの両方を除外したいという同様の問題がありました 、具体的には __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()


Linux
  1. 名前を変更せずにファイルマネージャでファイルとフォルダを非表示にする方法

  2. 区切り文字なしでファイルを貼り付けますか?

  3. Mvはプロンプトなしで読み取り専用ファイルを上書きしますか?

  1. 出口値を失うことなくTsを使用しますか?

  2. フォルダに触れずにファイルから実行権限を再帰的に削除するにはどうすればよいですか?

  3. sudo なしで emacs をインストールしますか?

  1. シンボリックリンクのないPwd?

  2. フォルダをMvとマージしますか?

  3. Bash:ls * フォルダーのグループ化なし