GNU/Linux >> Znalost Linux >  >> Linux

os.walk bez skrytých složek

Uvědomuji si, že to v otázce nebylo položeno, ale měl jsem podobný problém, kdy jsem chtěl vyloučit skryté soubory i soubory začínající __ , konkrétně __pycache__ adresáře. Přistál jsem na této otázce, protože jsem se snažil zjistit, proč moje porozumění seznamu nedělá to, co jsem očekával. Neupravoval jsem seznam na místě pomocí dirnames[:] .

Vytvořil jsem seznam prefixů, které jsem chtěl vyloučit, a upravil jsem dirname takto:

    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)]

Můj případ použití byl podobný jako u OP, až na to, že jsem chtěl vrátit počet celkového počtu podadresářů v určité složce. V mém případě jsem chtěl vynechat všechny podadresáře s názvem .git (stejně jako všechny složky, které mohou být vnořeny do těchto .git složky).

V Pythonu 3.6.7 jsem zjistil, že přístup přijaté odpovědi nefungoval – počítalo se všech .git složky a jejich podsložek. Zde je to, co pro mě fungovalo:

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))

Ne, není zde možnost os.walk() to je přeskočí. Budete to muset udělat sami (což je docela snadné):

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

Všimněte si dirs[:] = přiřazení řezu; os.walk rekurzivně prochází podadresáře uvedené v dirs . Nahrazením prvků z dirs s těmi, které splňují určitá kritéria (např. adresáře, jejichž názvy nezačínají . ), os.walk() nenavštíví adresáře, které nesplňují kritéria.

Toto funguje pouze v případě, že ponecháte topdown argument klíčového slova na True , z dokumentace os.walk() :

Když topdown je True , může volající upravit seznam jmen na místě (možná pomocí del nebo přiřazení řezu) a walk() přejde pouze do podadresářů, jejichž jména zůstanou v dirnames; toto lze použít k omezení vyhledávání, zadání konkrétního pořadí návštěvy nebo dokonce k informování walk() o adresářích, které volající vytvoří nebo přejmenuje, než bude pokračovat walk() znovu.


Linux
  1. Přesouvání souborů na Linuxu bez mv

  2. Jak skrýt soubory a složky ve Správci souborů bez přejmenování

  3. Pwd bez symbolických odkazů?

  1. Vložit soubory bez oddělovače?

  2. MV přepíše soubor pouze pro čtení bez výzvy?

  3. SEZNAM adresářů bez koncového lomítka /

  1. cp -r bez skrytých souborů

  2. Ansible:sudo bez hesla

  3. Odstraňte soubor bez dotazu