Quiero abrir una serie de subcarpetas en una carpeta y buscar algunos archivos de texto e imprimir algunas líneas de los archivos de texto. Estoy usando esto:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Pero esto tampoco puede acceder a las subcarpetas. ¿Alguien sabe cómo puedo usar el mismo comando para acceder a las subcarpetas también?
python
filesystems
glob
fnmatch
UserYmY
fuente
fuente

Respuestas:
En Python 3.5 y versiones posteriores, use la nueva
**/funcionalidad recursiva :Cuando
recursivese establece,**seguido de un separador de ruta coincide con 0 o más subdirectorios.En versiones anteriores de Python,
glob.glob()no se pueden enumerar archivos en subdirectorios de forma recursiva.En ese caso, usaría
os.walk()combinado con en sufnmatch.filter()lugar:Esto recorrerá sus directorios de forma recursiva y devolverá todos los nombres de ruta absolutos a los
.txtarchivos coincidentes . En este caso específico,fnmatch.filter()puede ser excesivo, también puede usar una.endswith()prueba:fuente
path to directory.recursive=Falsejunto con la**/funcionalidad no proporciona la lista de archivos solo en la carpeta dada, sino en sus hijos?**/da una lista de nombres de directorio en el directorio de trabajo actual, porque el patrón termina en/, y conrecursive=Falseusted básicamente tiene un doble*, coincidiendo exactamente igual que*/, pero menos eficiente.*/*si necesita todos los archivos en todos los subdirectorios.Para buscar archivos en subdirectorios inmediatos:
Para una versión recursiva que atraviese todos los subdirectorios, puede usar
**y pasarrecursive=Truedesde Python 3.5 :Ambas llamadas a funciones devuelven listas. Puede utilizar
glob.iglob()para devolver los caminos uno por uno. O usepathlib:Ambos métodos devuelven iteradores (puede obtener rutas una por una).
fuente
glob()admitir patrones en directorios.**caso de recursividad. Sin embargo, para**que el trabajo, usted tiene que ajustar elrecursion=Trueinterruptor, por cierto.Hay mucha confusión sobre este tema. Déjame ver si puedo aclararlo (Python 3.7):
glob.glob('*.txt') :coincide con todos los archivos que terminan en '.txt' en el directorio actualglob.glob('*/*.txt') :igual que 1glob.glob('**/*.txt') :coincide con todos los archivos que terminan en '.txt' solo en los subdirectorios inmediatos , pero no en el directorio actualglob.glob('*.txt',recursive=True) :igual que 1glob.glob('*/*.txt',recursive=True) :igual que 3glob.glob('**/*.txt',recursive=True):coincide con todos los archivos que terminan en '.txt' en el directorio actual y en todos los subdirectoriosAsí que es mejor especificar siempre
recursive=True.fuente
El paquete glob2 admite comodines y es razonablemente rápido
En mi computadora portátil, se necesitan aproximadamente 2 segundos para hacer coincidir > 60,000 rutas de archivo .
fuente
Puedes usar Formic con Python 2.6
Divulgación: soy el autor de este paquete.
fuente
Aquí hay una versión adaptada que habilita la
glob.globmisma funcionalidad sin usarglob2.Entonces, si tiene la siguiente estructura de directorios
Puedes hacer algo como esto
Prácticamente el
fnmatchpatrón coincide con todo el nombre del archivo, en lugar de solo el nombre del archivo.fuente
configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")No funciona para todos los casos, en su lugar use glob2
fuente
Si puede instalar el paquete glob2 ...
Todos los nombres de archivo y carpetas:
fuente
Si está ejecutando Python 3.4+, puede usar el
pathlibmódulo. ElPath.glob()método admite el**patrón, que significa "este directorio y todos los subdirectorios, de forma recursiva". Devuelve un generador que producePathobjetos para todos los archivos coincidentes.fuente
Como señaló Martijn, glob solo puede hacer esto a través del
**operador introducido en Python 3.5. Dado que el OP solicitó explícitamente el módulo glob, lo siguiente devolverá un iterador de evaluación perezoso que se comporta de manera similarSin
configfilesembargo, tenga en cuenta que solo puede iterar una vez en este enfoque. Si necesita una lista real de archivos de configuración que se puedan usar en múltiples operaciones, tendrá que crearla explícitamente usandolist(configfiles).fuente
El comando
rglobhará una recursión infinita hasta el subnivel más profundo de la estructura de su directorio. Sin embargo, si solo desea un nivel de profundidad, no lo use.Me doy cuenta de que el OP estaba hablando de usar glob.glob. Sin embargo, creo que esto responde a la intención, que es buscar en todas las subcarpetas de forma recursiva.
La
rglobfunción producido recientemente un aumento de 100x en la velocidad para un algoritmo de procesamiento de datos que se utiliza la estructura de carpetas como supuesto fijado para la orden de los datos de lectura. Sin embargo,rglobpudimos hacer un solo escaneo una vez a través de todos los archivos en o debajo de un directorio principal específico, guardar sus nombres en una lista (más de un millón de archivos), luego usar esa lista para determinar qué archivos necesitábamos abrir en cualquier apuntar en el futuro según las convenciones de nomenclatura de archivos solo frente a la carpeta en la que se encontraban.fuente