¿Hay alguna 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.
python
directory
subdirectory
Brad Zeis
fuente
fuente

Respuestas:
¿Te refieres a subdirectorios inmediatos, o cada directorio en el árbol?
De cualquier manera, podría usar
os.walkpara hacer esto:producirá una tupla para cada subdirectorio. La primera entrada en la 3-tupla es un nombre de directorio, entonces
debería darle todos los subdirectorios, de forma recursiva.
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, puede usarlo solo para darle los directorios secundarios inmediatos:
O vea las otras soluciones ya publicadas, utilizando
os.listdireos.path.isdir, incluidas las de " Cómo obtener todos los subdirectorios inmediatos en Python ".fuente
os.walk('.').next()[1]oos.walk('.').__next__()[1]directamente. En su lugar, use la función incorporadanext(), que está disponible tanto en Python 2 (consulte el documento) como en Python 3 (consulte el documento) . Por ejemplo:next(os.walk('.'))[1].os.walk('.').next()[1]directamente?iteraror.__next__()es un método interno y eliterator.next()uso debe pasar a la versión incorporada denext()acuerdo con PEP-3114. Ver PEP-3114 que fue aprobado en 2007.os.walkyos.listdir+os.path.isdirsoluciones: acabo de probar en un directorio con 10,000 subdirectorios (con millones de archivos en la jerarquía a continuación) y las diferencias de rendimiento son insignificantes.os.walk: "10 bucles, mejor de 3: 44,6 ms por bucle" yos.listdir+os.path.isdir: "10 bucles, mejor de 3: 45,1 ms por bucle"fuente
os.path.joinencendidoopara obtener el camino completo, de lo contrarioisdir(0)siempre devolverá falsoos.path.joindos veces, primero puede unirse y luego filtrar la lista usandoos.path.isdir:filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])Podrías usar
glob.globNo olvides el final
/después del*.fuente
/en los nombres/que es el separador de carpetas, haga lo siguiente:glob(os.path.join(path_to_directory, "*", ""))recursive=TrueMucho 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 y superior.
Esto le dará la ruta completa al subdirectorio. Si solo desea el nombre del subdirectorio, use en
f.namelugar def.pathhttps://docs.python.org/3/library/os.html#os.scandir
Ligeramente OT: en caso de que necesite todas las subcarpetas recursivamente y / o todos los archivos recursivamente , eche un vistazo a esta función, que es más rápida que
os.walk&globy devolverá una lista de todas las subcarpetas, así como todos los archivos dentro de esas (sub) subcarpetas: https://stackoverflow.com/a/59803793/2441026En caso de que desee solo todas las subcarpetas de forma recursiva :
Devuelve una lista de todas las subcarpetas con sus rutas completas. De nuevo, esto es más rápido que
os.walky mucho más rápido queglob.Un análisis de todas las funciones.
tl; dr:
- Si desea obtener todos los subdirectorios inmediatos para un uso de carpeta
os.scandir.- Si desea obtener todos los subdirectorios, incluso los anidados , use
os.walko, un poco más rápido, lafast_scandirfunción anterior.- Nunca lo use
os.walksolo para subdirectorios de nivel superior, ya que puede ser cientos (!) De veces más lento queos.scandir.os.walkserá la carpeta base. Por lo tanto, no obtendrá solo subdirectorios. Puedes usarfu.pop(0)para eliminarlo.Resultados :
Probado con W7x64, Python 3.8.1.
fuente
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.listdirconos.path.isdirfuente
Prefiero usar filter ( https://docs.python.org/2/library/functions.html#filter ), pero esto es solo cuestión de gustos.
fuente
Implementado esto usando python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
fuente
Puede obtener la lista de subdirectorios (y archivos) en Python 2.7 usando os.listdir (ruta)
fuente
os.listdirlistas de contenido del directorio, incluidos los archivos.Listado de directorios únicos
Listado de solo archivos en el directorio actual
fuente
Python 3.4 introdujo el
pathlibmódulo en la biblioteca estándar, que proporciona un enfoque orientado a objetos para manejar rutas del sistema de archivos:Pathlib también está disponible en Python 2.7 a través del módulo pathlib2 en PyPi.
fuente
for f in filter(Path.is_dir, p.iterdir()):Como me topé con este problema usando las rutas Python 3.4 y Windows UNC, aquí hay una variante para este entorno:
Pathlib es nuevo en Python 3.4 y hace que trabajar con rutas en diferentes sistemas operativos sea mucho más fácil: https://docs.python.org/3.4/library/pathlib.html
fuente
Aunque esta pregunta fue respondida hace mucho tiempo. Quiero recomendar el uso del
pathlibmódulo, ya que esta es una forma sólida de trabajar en Windows y Unix OS.Entonces, para obtener todas las rutas en un directorio específico, incluidos los subdirectorios:
etc.
fuente
Gracias por los consejos chicos. Me encontré con un problema con los enlaces suaves (recursión infinita) que se devuelven como directorios. Softlinks? ¡No queremos enlaces apestosos! Entonces...
Esto representaba solo los directorios, no los enlaces suaves:
fuente
[x[0] for x in inf]llama en python para poder buscarlo?Copiar y pegar amigable en
ipython:Salida de
print(folders):fuente
xes el elemento de la lista creada poros.listdir(d)porquelistdirdevolverá los archivos y carpetas con los que está usando elfiltercomandoos.path.isdirpara filtrar los archivos de la lista.Así es como lo hago.
fuente
Aquí hay un par de funciones simples basadas en el ejemplo de @Blair Conrad:
fuente
Basándose en la solución de Eli Bendersky, use el siguiente ejemplo:
¿Dónde
<your_directory>está la ruta al directorio que desea recorrer?fuente
Con la ruta completa y la contabilidad de ser camino
.,..,\\,..\\..\\subfolder, etc:fuente
Esta respuesta ya no parece existir.
fuente
Recientemente tuve una pregunta similar y descubrí que la mejor respuesta para python 3.6 (como agregó el usuario havlock) es usarla
os.scandir. Como parece que no hay solución para usarlo, agregaré la mía. Primero, una solución no recursiva que enumera solo los subdirectorios directamente bajo el directorio raíz.La versión recursiva se vería así:
tenga en cuenta que
entry.pathmaneja la ruta absoluta al subdirectorio. En caso de que solo necesite el nombre de la carpeta, puede usarentry.nameen su lugar. Consulte os.DirEntry para obtener detalles adicionales sobre elentryobjeto.fuente
usar una función de filtro
os.path.isdirsobreos.listdir()algo como estofilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])fuente
Esto mostrará una lista de todos los subdirectorios en el árbol de archivos.
pathlibes nuevo en la versión 3.4fuente
Función para devolver una lista de todos los subdirectorios dentro de una ruta de archivo determinada. Buscará en todo el árbol de archivos.
fuente
podemos obtener una lista de todas las carpetas usando os.walk ()
este pathObject es un objeto y podemos obtener una matriz por
Podemos obtener una lista de todos los subdirectorios iterando a través del arr e imprimiendo la matriz del medio
Esto imprimirá todo el subdirectorio.
Para obtener todos los archivos:
fuente
Esta función, con un padre dado,
directoryitera sobre todo sudirectoriesrecursividad yprintstodofilenameslo que encuentra dentro. Demasiado útilfuente
Al unir varias soluciones desde aquí, esto es lo que terminé usando:
fuente