¿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
globdevuelve una lista: ¿por qué no simplemente ejecutarla varias veces y concatenar los resultados?fuente
ProjectFilesaprojectFiles, 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
itertoolsporque 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
*.mp3y*.flacen 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
recursivebanderaglob.GLOBSTARbanderaHe 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
_globpegotes de varias extensiones de archivo.fuente
Esta es una
pathlibsolució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
extsque 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=Truey 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
globvarios 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
globpara obtener rutas usando múltiples coincidenciaspatternsy combinar todas las rutas en una sola lista usandoreduceyadd):fuente
Si usa
pathlibintente esto:fuente
Por los resultados que obtuve de las pruebas empíricas, resultó que esa
glob.globno 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
4mé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,
forbucles anidados ystringcomparació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 la2extensión dada (pyypyc) también devuelve resultados incorrectos.fuente
fuente
Esto debería funcionar:
fuente
Por ejemplo:
Una función:
fuente