Ecco una variante di una riga di comprensione dell'elenco della risposta di Pat (che include anche che si voleva glob in una specifica directory di progetto):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Passa il ciclo sopra le estensioni ( for ext in exts
), quindi per ogni estensione prendi ciascun file corrispondente al modello glob ( for f in glob.glob(os.path.join(project_dir, ext)
).
Questa soluzione è breve e senza inutili loop for, comprensioni di elenchi nidificati o funzioni per ingombrare il codice. Solo puro, espressivo, zen pitone .
Questa soluzione ti consente di avere un elenco personalizzato di exts
ciò che può essere modificato senza dover aggiornare il tuo codice. (Questa è sempre una buona pratica!)
La comprensione della lista è la stessa usata nella soluzione di Laurent (per la quale ho votato). Ma direi che di solito non è necessario scomporre una singola riga in una funzione separata, motivo per cui sto fornendo questo come soluzione alternativa.
Bonus:
Se devi cercare non solo una singola directory, ma anche tutte le sottodirectory, puoi passare recursive=True
e utilizzare il simbolo glob multi-directory **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Questo invocherà glob.glob('<project_dir>/**/*.txt', recursive=True)
e così via per ogni estensione.
1 Tecnicamente, il **
simbolo glob corrisponde semplicemente a uno o più caratteri inclusa la barra /
(diversamente dal singolare *
simbolo glob). In pratica, devi solo ricordare che fintanto che circondi **
di barre (separatori di percorso), corrisponde a zero o più directory.