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
Podrías usar glob.glob
from glob import glob
glob("/path/to/directory/*/")
No olvides el final /
después del *
.
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))
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))]