Obteniendo una lista de todos los subdirectorios en el directorio actual

¿Hay una manera de devolver una lista de todos los subdirectorios en el directorio actual en Python?

Sé que puedes hacer esto con archivos, pero necesito obtener la lista de directorios en su lugar.

¿Se refiere a subdirectorios inmediatos, o a todos los directorios que se encuentran en el árbol?

De cualquier manera, podrías usar os.walk para hacer esto:

 os.walk(directory) 

producirá una tupla para cada subdirectorio. Esta primera entrada en la tupla 3 es un nombre de directorio, por lo que

 [x[0] for x in os.walk(directory)] 

debería darle todos los subdirectorios, recursivamente.

Tenga en cuenta que la segunda entrada en la tupla es la lista de directorios secundarios de la entrada en la primera posición, por lo que podría usar esto en su lugar, pero no es probable que le ahorre mucho.

Sin embargo, puedes usarlo solo para darte los directorios secundarios inmediatos:

 next(os.walk('.'))[1] 

O vea las otras soluciones ya publicadas, usando os.listdir y os.path.isdir , incluidas aquellas en ” Cómo obtener todos los subdirectorios inmediatos en Python “.

 import os d = '.' [os.path.join(d, o) for o in os.listdir(d) if os.path.isdir(os.path.join(d,o))] 

Podrías usar glob.glob

 from glob import glob glob("/path/to/directory/*/") 

No olvides el final / después del * .

Mucho mejor que lo anterior, ya que no necesita varios os.path.join () y obtendrá la ruta completa directamente (si lo desea), puede hacerlo en Python 3.5+

 subfolders = [f.path for f in os.scandir(folder) if f.is_dir() ] 

Esto le dará la ruta completa al subdirectorio. Si solo desea que el nombre del subdirectorio use f.name lugar de f.path

https://docs.python.org/3/library/os.html#os.scandir

Si necesita una solución recursiva que encuentre todos los subdirectorios en los subdirectorios, use walk como se propuso anteriormente.

Si solo necesita los directorios secundarios del directorio actual, combine os.listdir con os.path.isdir

Prefiero usar el filtro ( https://docs.python.org/2/library/functions.html#filter ), pero esto es solo una cuestión de gusto.

 d='.' filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)) 

Implementado esto usando python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )

 import os print("root prints out directories only from what you specified") print("dirs prints out sub-directories from root") print("files prints out all files from root and directories") print("*" * 20) for root, dirs, files in os.walk("/var/log"): print(root) print(dirs) print(files) 

Puede obtener la lista de subdirectorios (y archivos) en Python 2.7 utilizando os.listdir (ruta)

 import os os.listdir(path) # list of subdirectories and files 

Listado solo directorios

 print("\nWe are listing out only the directories in current directory -") directories_in_curdir = filter(os.path.isdir, os.listdir(os.curdir)) print(directories_in_curdir) 

Listado solo archivos en el directorio actual

 files = filter(os.path.isfile, os.listdir(os.curdir)) print("\nThe following are the list of all files in the current directory -") print(files) 

Desde que me topé con este problema usando Python 3.4 y Windows UNC, aquí hay una variante para este entorno:

 from pathlib import WindowsPath def SubDirPath (d): return [f for f in d.iterdir() if f.is_dir()] subdirs = SubDirPath(WindowsPath(r'\\file01.acme.local\home$')) print(subdirs) 

Pathlib es nuevo en Python 3.4 y facilita mucho el trabajo con rutas en diferentes sistemas operativos: https://docs.python.org/3.4/library/pathlib.html

Gracias por los consejos chicos. Me encontré con un problema con los enlaces (recursión infinita) que se devolvían como dirs. Enlaces blandos? ¡No queremos que los enlaces blandos apesten! Asi que…

Esto representa solo los directorios, no los enlaces blandos:

 >>> import os >>> inf = os.walk('.') >>> [x[0] for x in inf] ['.', './iamadir'] 

Aunque esta pregunta se responde hace mucho tiempo. Quiero recomendar el uso del módulo pathlib ya que esta es una forma robusta de trabajar en sistemas operativos Windows y Unix.

Entonces para obtener todas las rutas en un directorio específico incluyendo subdirectorios:

 from pathlib import Path paths = list(Path('myhomefolder', 'folder').glob('**/*.txt')) # all sorts of operations file = paths[0] file.name file.stem file.parent file.suffix 

etc.

Python 3.4 introdujo el módulo pathlib en la biblioteca estándar, que proporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos:

 from pathlib import Path p = Path('./') # List comprehension [f for f in p.iterdir() if f.is_dir()] # The trailing slash to glob indicated directories # This will also include the current directory '.' list(p.glob('**/')) 

Pathlib también está disponible en Python 2.7 a través del módulo pathlib2 en PyPi.

Sobre la base de la solución de Eli Bendersky, use el siguiente ejemplo:

 import os test_directory =  for child in os.listdir(test_directory): test_path = os.path.join(test_directory, child) if os.path.isdir(test_path): print test_path # Do stuff to the directory "test_path" 

donde es la ruta al directorio que desea recorrer.

Aquí hay un par de funciones simples basadas en el ejemplo de @Blair Conrad:

 import os def get_subdirs(dir): "Get a list of immediate subdirectories" return next(os.walk(dir))[1] def get_subfiles(dir): "Get a list of immediate subfiles" return next(os.walk(dir))[2] 

Con ruta completa y contabilizando por ser ruta . , .. , \\ , ..\\..\\subfolder , etc:

 import os, pprint pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \ for x in os.walk(os.path.abspath(path))]) 

Esta respuesta no parecía existir ya.

 directories = [ x for x in os.listdir('.') if os.path.isdir(x) ] 

Recientemente he tenido una pregunta similar, y descubrí que la mejor respuesta para Python 3.6 (como el usuario havlock agregó) es usar os.scandir . Como parece que no hay una solución usándolo, agregaré la mía. Primero, una solución no recursiva que enumera solo los subdirectorios directamente debajo del directorio raíz.

 def get_dirlist(rootdir): dirlist = [] with os.scandir(rootdir) as rit: for entry in rit: if not entry.name.startswith('.') and entry.is_dir(): dirlist.append(entry.path) dirlist.sort() # Optional, in case you want sorted directory names return dirlist 

La versión recursiva se vería así:

 def get_dirlist(rootdir): dirlist = [] with os.scandir(rootdir) as rit: for entry in rit: if not entry.name.startswith('.') and entry.is_dir(): dirlist.append(entry.path) dirlist += get_dirlist(entry.path) dirlist.sort() # Optional, in case you want sorted directory names return dirlist 

tenga en cuenta que entry.path maneja la ruta absoluta al subdirectorio. En caso de que solo necesite el nombre de la carpeta, puede usar entry.name en entry.name lugar. Consulte os.DirEntry para obtener detalles adicionales sobre el objeto de entry .

use una función de filtro os.path.isdir sobre os.listdir() algo como este filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])

Copia pegar amigable en ipython :

 import os d='.' folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))) 

Salida de print(folders) :

 ['folderA', 'folderB'] 

Si solo desea la carpeta de la lista superior, use listdir ya que la caminata lleva demasiado tiempo.