Aquí hay una variante de comprensión de la lista de una línea de la respuesta de Pat (que también incluye que usted desea glob en un directorio de proyecto específico):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Recorre las extensiones ( for ext in exts
) y luego, para cada extensión, toma cada archivo que coincida con el patrón global ( for f in glob.glob(os.path.join(project_dir, ext)
).
Esta solución es breve y sin ningún for-loop innecesario, comprensión de listas anidadas o funciones para saturar el código. Solo Zen puro, expresivo y pitónico .
Esta solución le permite tener una lista personalizada exts
que se puede cambiar sin tener que actualizar su código. (¡Esto siempre es una buena práctica!)
La lista de comprensión es la misma utilizada en la solución de Laurent (por la que he votado). Pero yo diría que generalmente no es necesario factorizar una sola línea a una función separada, por lo que proporciono esto como una solución alternativa.
Prima:
Si necesita buscar no solo en un solo directorio, sino también en todos los subdirectorios, puede pasar recursive=True
y usar el símbolo de globo multidireccional **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Esto invocará glob.glob('<project_dir>/**/*.txt', recursive=True)
y así sucesivamente para cada extensión.
1 Técnicamente, el **
símbolo glob simplemente coincide con uno o más caracteres, incluida la barra diagonal /
(a diferencia del *
símbolo glob singular ). En la práctica, solo debe recordar que, siempre que rodee **
con barras diagonales (separadores de ruta), coincide con cero o más directorios.