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
recursive
se 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
.txt
archivos coincidentes . En este caso específico,fnmatch.filter()
puede ser excesivo, también puede usar una.endswith()
prueba:fuente
path to directory
.recursive=False
junto 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=False
usted 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=True
desde 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=True
interruptor, 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.glob
misma funcionalidad sin usarglob2
.Entonces, si tiene la siguiente estructura de directorios
Puedes hacer algo como esto
Prácticamente el
fnmatch
patró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
pathlib
módulo. ElPath.glob()
método admite el**
patrón, que significa "este directorio y todos los subdirectorios, de forma recursiva". Devuelve un generador que producePath
objetos 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
configfiles
embargo, 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
rglob
hará 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
rglob
funció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,rglob
pudimos 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