varios una recorrer manejo lista leer explorador directorios directorio con como carpetas carpeta archivos actual abrir python directory subdirectory

python - recorrer - Obtener una lista de todos los subdirectorios en el directorio actual



python lista carpetas (21)

¿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.


Listado solo directorios

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

Listado solo archivos en el directorio actual

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)


¿Te refieres a los subdirectorios inmediatos, o a todos los directorios directamente en el árbol?

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

os.walk(directory)

cederá 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, podría usarlo solo para darle 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 ".


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

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


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:

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)

etc.


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

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(''**/''))


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'']


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

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

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


Esta respuesta no parecía existir ya.

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


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'']


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)


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


Podrías usar glob.glob

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

No olvides el final / después del * .



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


Python 3.4 introdujo https://docs.python.org/3.4/library/pathlib.html en la biblioteca estándar, que proporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos:

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]

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


Recientemente tuve una pregunta similar, y descubrí que la mejor respuesta para Python 3.6 (como usuario havlock agregado) 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 .


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


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


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

import os test_directory = <your_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 <your_directory> es la ruta al directorio que desea recorrer.


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/'')])


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