Python 3.5+
Como estás en una nueva python, debes usarla pathlib.Path.rglob
desde el pathlib
módulo.
from pathlib import Path
for path in Path('src').rglob('*.c'):
print(path.name)
Si no desea usar pathlib, solo use glob.glob
, pero no olvide pasar el recursive
parámetro de palabra clave.
Para los casos en que los archivos coincidentes comienzan con un punto (.); como archivos en el directorio actual o archivos ocultos en el sistema basado en Unix, use la os.walk
solución a continuación.
Versiones antiguas de Python
Para versiones anteriores de Python, use os.walk
para recorrer recursivamente un directorio y fnmatch.filter
hacer coincidir una expresión simple:
import fnmatch
import os
matches = []
for root, dirnames, filenames in os.walk('src'):
for filename in fnmatch.filter(filenames, '*.c'):
matches.append(os.path.join(root, filename))
os.path.walk()
un poco más complicado de usar queos.walk()
os.path.walk()
está en desuso y se ha eliminado en Python 3.pathlib.Path('src').glob('**/*.c')
debería funcionar.Similar a otras soluciones, pero usando fnmatch.fnmatch en lugar de glob, ya que os.walk ya enumeró los nombres de archivo:
Además, el uso de un generador le permite procesar cada archivo tal como se encuentra, en lugar de buscar todos los archivos y luego procesarlos.
fuente
reduce(lambda x, y: x+y, map(lambda (r,_,x):map(lambda f: r+'/'+f, filter(lambda f: fnmatch.fnmatch(f, pattern), x)), os.walk('src/webapp/test_scripts')))
(os.path.join(root,filename) for root, dirs, files in os.walk(directory) for filename in files if fnmatch.fnmatch(filename, pattern))
Modifiqué el módulo glob para admitir ** para el globbing recursivo, por ejemplo:
https://github.com/miracle2k/python-glob2/
Útil cuando desea proporcionar a sus usuarios la capacidad de usar la sintaxis **, y por lo tanto os.walk () por sí solo no es lo suficientemente bueno.
fuente
**
con el módulo glob oficial, haga:glob(path, recursive=True)
Comenzando con Python 3.4, uno puede usar el
glob()
método de una de lasPath
clases en el nuevo módulo pathlib , que admite**
comodines. Por ejemplo:Actualización: a partir de Python 3.5, la misma sintaxis también es compatible
glob.glob()
.fuente
fnmatch
le ofrece exactamente los mismos patronesglob
, por lo que este es realmente un excelente reemplazo paraglob.glob
una semántica muy cercana. Una versión iterativa (p. Ej., Un generador), para la cual IOW es un reemplazoglob.iglob
, es una adaptación trivial (soloyield
los resultados intermedios a medida que avanza, en lugar deextend
una sola lista de resultados para regresar al final).fuente
recursive_glob(pattern, treeroot='.')
como sugerí en mi edición? De esta manera, se puede llamar, por ejemplo,recursive_glob('*.txt')
y coincidir intuitivamente con la sintaxis deglob
.fnmatch.filter
, que es aproximadamente tan útil como la posibilidad de hacer coincidir un solo argumentoglob.glob
.Para pitón> = 3.5 se puede utilizar
**
,recursive=True
:Manifestación
fuente
Deberá utilizar
os.walk
para recopilar nombres de archivo que coincidan con sus criterios. Por ejemplo:fuente
Aquí hay una solución con comprensiones de listas anidadas
os.walk
y coincidencia de sufijos simple en lugar deglob
:Se puede comprimir a una sola línea:
o generalizado como una función:
Si necesita
glob
patrones de estilo completos , puede seguir el ejemplo de Alex y Bruno y usarfnmatch
:fuente
Recientemente tuve que recuperar mis fotos con la extensión .jpg. Ejecuté photorec y recuperé 4579 directorios de 2.2 millones de archivos, con una gran variedad de extensiones. Con el script a continuación pude seleccionar 50133 archivos con extensión .jpg en minutos:
fuente
Considere
pathlib.rglob()
.Ver también relacionada @ de taleinat puesto aquí y uno similar puesto en otro lugar.
fuente
Johan y Bruno brindan soluciones excelentes en el requisito mínimo como se indicó. Acabo de lanzar Formic que implementa Ant FileSet y Globs que pueden manejar este y otros escenarios más complicados. Una implementación de su requerimiento es:
fuente
basado en otras respuestas, esta es mi implementación de trabajo actual, que recupera archivos xml anidados en un directorio raíz:
Realmente me estoy divirtiendo con python :)
fuente
Otra forma de hacerlo usando solo el módulo glob. Simplemente siembra el método rglob con un directorio base inicial y un patrón que coincida, y devolverá una lista de nombres de archivos coincidentes.
fuente
Para python 3.5 y posterior
aún más podría necesitar
fuente
/**
file_names_array = glob.glob('src/**/*.c', recursive=True)
O con una lista de comprensión:
fuente
Acabo de hacer esto ... imprimirá archivos y directorios de forma jerárquica
Pero no usé fnmatch ni caminé
fuente
Ese usa fnmatch o expresión regular:
fuente
Además de las respuestas sugeridas, puedes hacer esto con algo de generación perezosa y magia de comprensión de listas:
Además de encajar en una línea y evitar listas innecesarias en la memoria, esto también tiene el agradable efecto secundario, que puede usarlo de manera similar al operador **, por ejemplo, podría usarlo
os.path.join(root, 'some/path/*.c')
para obtener todos los archivos .c en todos subdirectorios de src que tienen esta estructura.fuente
Este es un código de trabajo en Python 2.7. Como parte de mi trabajo devops, se me pidió que escribiera un script que moviera los archivos de configuración marcados con live-appName.properties a appName.properties. Podría haber otros archivos de extensión, como live-appName.xml.
A continuación hay un código de trabajo para esto, que encuentra los archivos en los directorios dados (nivel anidado) y luego los renombra (mueve) al nombre de archivo requerido
Esta función se llama desde un script principal
Espero que esto ayude a alguien que lucha con problemas similares.
fuente
Versión simplificada de la respuesta de Johan Dahlin, sin fnmatch .
fuente
Aquí está mi solución usando la comprensión de listas para buscar múltiples extensiones de archivos de forma recursiva en un directorio y todos los subdirectorios:
fuente
fuente
Modifiqué la respuesta principal en esta publicación ... y recientemente creé este script que recorrerá todos los archivos en un directorio dado (searchdir) y los subdirectorios debajo de él ... e imprime el nombre del archivo, rootdir, fecha de modificación / creación, y Talla.
Espero que esto ayude a alguien ... y que puedan recorrer el directorio y obtener información de archivo.
fuente
Aquí hay una solución que hará coincidir el patrón con la ruta completa y no solo con el nombre de archivo base.
Se utiliza
fnmatch.translate
para convertir un patrón de estilo glob en una expresión regular, que luego se compara con la ruta completa de cada archivo encontrado al recorrer el directorio.re.IGNORECASE
es opcional, pero deseable en Windows ya que el sistema de archivos en sí no distingue entre mayúsculas y minúsculas. (No me molesté en compilar la expresión regular porque los documentos indican que debe almacenarse en caché internamente).fuente
Necesitaba una solución para python 2.x que funcione rápido en directorios grandes.
Me comprometo con esto:
Tenga en cuenta que es posible que necesite un manejo de excepciones en caso de
ls
que no encuentre ningún archivo coincidente.fuente
ls src/**/*.c
solo funciona si la opción globstar está habilitada (shopt -s globstar
) - mira esta respuesta para más detalles.