Mi rendo conto che non è stato posto nella domanda, ma ho avuto un problema simile in cui volevo escludere sia i file nascosti che i file che iniziano con __
, in particolare __pycache__
directory. Sono arrivato a questa domanda perché stavo cercando di capire perché la mia comprensione dell'elenco non stava facendo quello che mi aspettavo. Non stavo modificando l'elenco in vigore con dirnames[:]
.
Ho creato un elenco di prefissi che volevo escludere e ho modificato i dirname in questo modo:
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)]
Il mio caso d'uso era simile a quello di OP, tranne per il fatto che volevo restituire un conteggio del numero totale di sottodirectory all'interno di una determinata cartella. Nel mio caso ho voluto omettere tutte le sottodirectory denominate .git
(così come tutte le cartelle che possono essere nidificate all'interno di questi .git
cartelle).
In Python 3.6.7, ho scoperto che l'approccio della risposta accettata non funzionava:contava tutti i .git
cartella e le relative sottocartelle. Ecco cosa ha funzionato per me:
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))
No, non c'è alcuna opzione per os.walk()
che salterà quelli. Dovrai farlo da solo (il che è abbastanza facile):
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
Nota il dirs[:] =
assegnazione delle fette; os.walk
attraversa ricorsivamente le sottodirectory elencate in dirs
. Sostituendo gli elementi di dirs
con quelli che soddisfano un criterio (ad esempio, directory i cui nomi non iniziano con .
), os.walk()
non visiterà le directory che non soddisfano i criteri.
Funziona solo se mantieni il topdown
argomento della parola chiave a True
, dalla documentazione di os.walk()
:
Quando
topdown
èTrue
, il chiamante può modificare sul posto l'elenco dei nomi delle dir (magari usandodel
o assegnazione slice) ewalk()
ricorrerà solo nelle sottodirectory i cui nomi rimangono in dirnames; questo può essere utilizzato per sfoltire la ricerca, imporre uno specifico ordine di visita o anche per informarewalk()
sulle directory che il chiamante crea o rinomina prima di riprenderewalk()
di nuovo.