Este tutorial te mostrará una forma muy sencilla de listar un directorio de forma recursiva en Python, de manera que puedas acceder al árbol completo de carpetas y ficheros.
Tomaremos como referencia la siguiente estructura de directorios:
+ ejemplo |_ + dir_a |_ fichero2.txt |_ fichero3.txt |_ + dir_b |_ fichero4.txt |_ documento.txt |_ fichero1.txt |_ imagen.jpg
Listar un directorio de manera recursiva con walk
Python pone a nuestra disposición la función walk()
del módulo os
para recorrer un árbol de directorios de forma recursiva. Esta función permite recorrer una estructura de directorios siguiendo una estrategia de arriba a abajo o de abajo a arriba. Por defecto es de arriba a abajo. Esto quiere decir que en primer lugar se lista el contenido del directorio actual, a continuación el de los directorios que se encuentran en el primer nivel, seguidamente los del segundo y, así, sucesivamente.
walk()
recibe como argumento la ruta a partir de la cuál se accede al contenido. Si no se especifica, se toma como referencia el directorio actual. La función devuelve un iterador que, en cada iteración, devuelve tres valores: el nombre de la ruta completa del directorio actual, la lista de directorios del directorio actual y la lista de ficheros del directorio actual.
Veamos cómo usar walk()
para listar el árbol de directorios del ejemplo de forma recursiva y mostrar el nombre de los ficheros de cada una de las carpetas:
import os ejemplo_dir = '/Users/Juanjo/ejemplo/' for nombre_directorio, dirs, ficheros in os.walk(ejemplo_dir): print(nombre_directorio) for nombre_fichero in ficheros: print(nombre_fichero)
El resultado del script anterior es el siguiente:
/Users/Juanjo/ejemplo/ documento.txt imagen.jpg fichero1.txt /Users/Juanjo/ejemplo/dir_b fichero4.txt /Users/Juanjo/ejemplo/dir_a fichero2.txt fichero3.txt
Como puedes apreciar, se lista el directorio de forma recursiva comenzando en primer lugar por el directorio ejemplo y, a continuación, los directorios dir_b y dir_a.
Modificar el comportamiento por defecto de walk
Podemos utilizar una estrategia de abajo a arriba pasando el argumento topdown=False
:
import os ejemplo_dir = '/Users/Juanjo/ejemplo/' for nombre_directorio, dirs, ficheros in os.walk(ejemplo_dir, topdown=False): print(nombre_directorio) for nombre_fichero in ficheros: print(nombre_fichero)
En esta ocasión, la salida del script es:
/Users/Juanjo/ejemplo/dir_b fichero4.txt /Users/Juanjo/ejemplo/dir_a fichero2.txt fichero3.txt /Users/Juanjo/ejemplo/ documento.txt imagen.jpg fichero1.txt
Si te fijas, esta vez se muestra primero el contenido de los directorios más profundos del árbol.
Por defecto, walk()
no sigue los enlaces simbólicos que encuentre en un directorio. Para ello, hay que llamar a la función pasando el argumento followlinks=True
.
Conclusiones
Ya has visto que es muy fácil listar un directorio de forma recursiva en Python con walk()
.
Si lo que buscas es, simplemente, cómo recorrer el contenido de un directorio, puedes consultar este otro artículo.