¿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.walk
para 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.listdir
eos.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.walk
yos.listdir
+os.path.isdir
soluciones: 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.join
encendidoo
para obtener el camino completo, de lo contrarioisdir(0)
siempre devolverá falsoos.path.join
dos 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.glob
No 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=True
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 y superior.
Esto le dará la ruta completa al subdirectorio. Si solo desea el nombre del subdirectorio, use en
f.name
lugar def.path
https://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
&glob
y 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.walk
y 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.walk
o, un poco más rápido, lafast_scandir
función anterior.- Nunca lo use
os.walk
solo para subdirectorios de nivel superior, ya que puede ser cientos (!) De veces más lento queos.scandir
.os.walk
será 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.listdir
conos.path.isdir
fuente
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.listdir
listas 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
pathlib
mó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
pathlib
mó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
x
es el elemento de la lista creada poros.listdir(d)
porquelistdir
devolverá los archivos y carpetas con los que está usando elfilter
comandoos.path.isdir
para 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.path
maneja la ruta absoluta al subdirectorio. En caso de que solo necesite el nombre de la carpeta, puede usarentry.name
en su lugar. Consulte os.DirEntry para obtener detalles adicionales sobre elentry
objeto.fuente
usar una función de filtro
os.path.isdir
sobreos.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.
pathlib
es 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,
directory
itera sobre todo sudirectories
recursividad yprints
todofilenames
lo que encuentra dentro. Demasiado útilfuente
Al unir varias soluciones desde aquí, esto es lo que terminé usando:
fuente