¿Hay una mejor manera de usar glob.glob en python para obtener una lista de múltiples tipos de archivos como .txt, .mdown y .markdown? En este momento tengo algo como esto:
projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )
Respuestas:
Tal vez hay una mejor manera, pero ¿qué tal:
Quizás haya otra manera, así que espere en caso de que alguien más presente una mejor respuesta.
fuente
files_grabbed = [glob.glob(e) for e in ['*.pdf', '*.cpp']]
[f for f_ in [glob.glob(e) for e in ('*.jpg', '*.mp4')] for f in f_]
Si necesita especificar una ruta, repita los patrones de coincidencia y mantenga la unión dentro del bucle para simplificar:
fuente
glob
devuelve una lista: ¿por qué no simplemente ejecutarla varias veces y concatenar los resultados?fuente
ProjectFiles
aprojectFiles
, pero es una gran solución.Encadena los resultados:
Luego:
fuente
chain.from_iterable
. Así que esto es similar, pero menos legible:it.chain(*(glob.iglob(pattern) for pattern in patterns))
.Tantas respuestas que sugieren englobar tantas veces como el número de extensiones, preferiría hacerlo solo una vez:
fuente
con glob no es posible. solo puedes usar:
* ¿coincide con todo
? coincide con cualquier carácter individual
[seq] coincide con cualquier carácter en seq
[! seq] coincide con cualquier carácter que no esté en seq
use os.listdir y una expresión regular para verificar patrones:
fuente
itertools
porque los cambios de patrón posteriores también deben ser extravagantes (digamos que desea permitir mayúsculas y minúsculas) . Ah, y podría ser más limpio escribir'.*\.(txt|sql)'
Por ejemplo, para
*.mp3
y*.flac
en varias carpetas, puede hacer:La idea puede extenderse a más extensiones de archivo, pero debe verificar que las combinaciones no coincidan con ninguna otra extensión de archivo no deseada que pueda tener en esas carpetas. Entonces ten cuidado con esto.
Para combinar automáticamente una lista arbitraria de extensiones en un único patrón global, puede hacer lo siguiente:
fuente
Una frase, solo por el placer de hacerlo ...
salida:
fuente
Después de venir aquí por ayuda, hice mi propia solución y quería compartirla. Se basa en la respuesta de user2363986, pero creo que esto es más escalable. Lo que significa que si tiene 1000 extensiones, el código seguirá luciendo elegante.
fuente
directoryPath = "/Users/bla/bla/images_dir*."
fuente
Si bien el glob predeterminado de Python realmente no sigue al glob de Bash, puede hacerlo con otras bibliotecas. Podemos habilitar llaves en el globo de wcmatch .
Incluso puede usar patrones de glob extendidos si esa es su preferencia:
fuente
recursive
banderaglob.GLOBSTAR
banderaHe lanzado Formic, que implementa múltiples inclusiones de manera similar a FileSet y Globs de Apache Ant .
La búsqueda se puede implementar:
Debido a que se implementa el glob Ant completo, puede incluir diferentes directorios con cada patrón, por lo que puede elegir solo esos archivos .txt en un subdirectorio y el .markdown en otro, por ejemplo:
Espero que esto ayude.
fuente
La siguiente función
_glob
pegotes de varias extensiones de archivo.fuente
Esta es una
pathlib
solución Python 3.4+ :También ignora todos los nombres de archivo que comienzan con
~
.fuente
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):
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 :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.fuente
No
glob
, pero aquí hay otra forma de usar una lista de comprensión:fuente
Puede intentar hacer una lista manual que compare la extensión de las existentes con las que necesita.
fuente
https://docs.python.org/3.5/library/functools.html#functools.reduce https://docs.python.org/3.5/library/operator.html#operator.add
fuente
Para
glob
varios tipos de archivos, debe llamarglob()
función varias veces en un bucle. Como esta función devuelve una lista, debe concatenar las listas.Por ejemplo, esta función hace el trabajo:
Uso simple:
También puede usar
glob.iglob()
para tener un iterador:fuente
Usa una lista de extensiones e itera
fuente
Podrías usar filter:
fuente
También puedes usar
reduce()
así:esto crea una lista
glob.glob()
para cada patrón y los reduce a una sola lista.fuente
Un globo, muchas extensiones ... pero solución imperfecta (podría coincidir con otros archivos).
fuente
Tuve el mismo problema y esto es lo que se me ocurrió
fuente
Otra solución más (se usa
glob
para obtener rutas usando múltiples coincidenciaspatterns
y combinar todas las rutas en una sola lista usandoreduce
yadd
):fuente
Si usa
pathlib
intente esto:fuente
Por los resultados que obtuve de las pruebas empíricas, resultó que esa
glob.glob
no es la mejor manera de filtrar archivos por sus extensiones. Algunas de las razones son:He probado (para la corrección y la eficiencia en el tiempo) los siguientes
4
métodos diferentes para filtrar archivos por extensiones y los coloca enlist
:Al ejecutar el código anterior en mi computadora portátil, obtuve los siguientes resultados autoexplicativos.
La forma más rápida de filtrar archivos por extensiones, incluso es la más fea. Es decir,
for
bucles anidados ystring
comparación usando elendswith()
método.Además, como puede ver, los algoritmos globales (con el patrón
E:\x\y\z\**/*[py][pyc]
) incluso con la2
extensión dada (py
ypyc
) también devuelve resultados incorrectos.fuente
fuente
Esto debería funcionar:
fuente
Por ejemplo:
Una función:
fuente