← Volver

Cómo recorrer un árbol de archivos y carpetas

La función estándar os.walk() genera un árbol de archivos y carpetas a partir de una ruta inicial para ser recorrido como un objeto iterable. De este modo, os.walk("C:/"), por ejemplo, en Windows, permite recorrer todos los archivos y carpetas del sistema (considerando que C: es la única unidad).

import os

for dirpath, dirnames, filenames in os.walk("C:/Python35"):
print("Ruta actual:", dirpath)
print("Carpetas:", ", ".join(dirnames))
print("Archivos:", ", ".join(filenames))

Este código genera un árbol a partir del directorio de instalación de Python (para indicar el directorio actual, utilícese os.walk(".")). El valor retornado es un objeto iterable cuyos elementos son tuplas, y éstas, a su vez, contienen otros tres elementos: la ruta del directorio actual que se está recorriendo (dirpath), una lista con los nombres de las carpetas (dirnames) y otra con los nombres de los archivos (filenames).

Los primeros resultados en pantalla son más o menos los siguientes.

Ruta actual: C:/Python35
Carpetas: DLLs, Doc, gevent, include, Lib, libs, Release, Scripts, share, tcl, Tools
Archivos: LICENSE.txt, NEWS.txt, python.exe, python3.dll, python35.dll, pythonw.exe, pywin32-wininst.log, README.txt, vcruntime140.dll

Ruta actual: C:/Python35\DLLs
Carpetas:
Archivos: py.ico, pyc.ico, pyexpat.pyd, select.pyd, sqlite3.dll, tcl86t.dll, tk86t.dll, unicodedata.pyd, winsound.pyd, _bz2.pyd, _ctypes.pyd, _ctypes_test.pyd, _decimal.pyd, _elementtree.pyd, _hashlib.pyd, _lzma.pyd, _msi.pyd, _multiprocessing.pyd, _overlapped.pyd, _socket.pyd, _sqlite3.pyd, _ssl.pyd, _testbuffer.pyd, _testcapi.pyd, _testimportmultiple.pyd, _testmultiphase.pyd, _tkinter.pyd

Ruta actual: C:/Python35\Doc
Carpetas:
Archivos: python351.chm

[...]

Como puede observarse, la primera ruta en analizarse es siempre el argumento indicado (C:/Python35/ en nuestro caso), pues es el punto de partida. Luego, se prosigue con la primera carpeta encontrada dentro de ésta, a saber, DLLs. Como dentro de ella no hay más directorios, entonces se prosigue con la segunda de la ruta anterior, Doc. Este proceso se repite hasta que se haya generado todos los elementos.

La función es especialmente útil para buscar archivos y/o carpetas en el sistema o en alguna ruta en particular. Por ejemplo, el siguiente código imprime la dirección de todos los archivos que contienen la palabra "python" dentro de C:/Python35/ (y todas sus subcarpetas).

import os
import os.path

for dirpath, dirnames, filenames in os.walk("C:/Python35/"):
for filename in filenames:
if "python" in filename.lower():
print(os.path.join(dirpath, filename))



¿Alguna duda sobre este código? ¡Preguntanos en el foro!