Quiero poder enumerar solo los directorios dentro de alguna carpeta. Esto significa que no quiero nombres de archivos en la lista, ni quiero subcarpetas adicionales.
Veamos si un ejemplo ayuda. En el directorio actual tenemos:
>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
'Tools', 'w9xpopen.exe']
Sin embargo, no quiero que aparezcan nombres de archivos. Tampoco quiero subcarpetas como \ Lib \ curses. Esencialmente, lo que quiero funciona con lo siguiente:
>>> for root, dirnames, filenames in os.walk('.'):
... print dirnames
... break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
Sin embargo, me pregunto si hay una manera más simple de lograr los mismos resultados. Tengo la impresión de que usar os.walk solo para devolver el nivel superior es ineficiente / demasiado.
python
filesystems
fuentesjr
fuente
fuente
os.walk
Usar
os.walk
con lanext
función del artículo:Para Python <= 2.5 use:
Como funciona esto
os.walk
es un generador y la llamadanext
obtendrá el primer resultado en forma de 3 tuplas (dirpath, dirnames, nombres de archivo). Por lo tanto, el[1]
índice devuelve solo eldirnames
de esa tupla.fuente
DIRNAMES=1
y luegonext()[DIRNAMES]
para que sea más fácil de entender para futuros mantenedores de código.os.walk( os.path.join(mypath,'.')).next()[1]
sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
Filtre la lista usando os.path.isdir para detectar directorios.
fuente
os.listdir
devuelve un nombre de archivo / carpeta, pasado aos.path.isdir
, pero este último necesita una ruta completa.timeit(os.walk(os.getcwd()).next()[1])
1000 loops, best of 3: 734 µs per loop
timeit(filter(os.path.isdir, os.listdir(os.getcwd())))
1000 loops, best of 3: 477 µs per loop
fuente
Tenga en cuenta que, en lugar de hacerlo
os.listdir(os.getcwd())
, es preferible hacerloos.listdir(os.path.curdir)
. Una llamada de función menos, y es tan portátil.Entonces, para completar la respuesta, para obtener una lista de directorios en una carpeta:
Si prefiere nombres de ruta completos, use esta función:
fuente
Esto parece funcionar también (al menos en Linux):
fuente
glob
. Puede ahorrarle mucho código, especialmente iteraciones, y es muy similar al uso del terminal UNIX (ls
)Solo para agregar que usar os.listdir () no " requiere mucho procesamiento frente a muy simple os.walk (). Next () [1]" . Esto se debe a que os.walk () usa os.listdir () internamente. De hecho, si los prueba juntos:
El filtrado de os.listdir () es muy ligeramente más rápido.
fuente
scandir
paquete, está felizmente disponible para Python 2.6 en adelante como un paquete instalable en PyPI. Ofrece reemplazos paraos.walk
yos.listdir
que son mucho más rápidos.Una forma mucho más simple y elegante es usar esto:
Ejecute este script en la misma carpeta para la que desea nombres de carpeta. Le dará exactamente el nombre inmediato de las carpetas (también sin la ruta completa de las carpetas).
fuente
Usando la comprensión de la lista,
Creo que es la forma más sencilla
fuente
siendo un novato aquí, aún no puedo comentar directamente, pero aquí hay una pequeña corrección que me gustaría agregar a la siguiente parte de la respuesta de ΤΖΩΤΖΙΟΥ :
Para aquellos que todavía están en Python <2.4 : la construcción interna debe ser una lista en lugar de una tupla y, por lo tanto, debería leer así:
de lo contrario, se obtiene un error de sintaxis.
fuente
fuente
Para obtener una lista de nombres de ruta completos, prefiero esta versión a las otras soluciones aquí:
fuente
fuente
Una opción más segura que no falla cuando no hay directorio.
fuente
¿Al igual que?
fuente
Python 3.4 introdujo el
pathlib
módulo en la biblioteca estándar, que proporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos:fuente
fuente