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
jeTrue
, může volající upravit seznam jmen na místě (možná pomocídel
nebo 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.