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ž
topdownjeTrue, může volající upravit seznam jmen na místě (možná pomocídelnebo přiřazení řezu) awalk()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čovatwalk()znovu.