HOWTO · Python
Listar todos los archivos en directorio y subdirectorios en Python
Este tutorial demuestra cómo enumerar todos los archivos en un directorio y subdirectorios en Python.
En esta página
Para obtener las rutas de todos los archivos que hay bajo un directorio inicial, usa os.walk() de Python. Recorre el árbol de directorios y devuelve, para cada directorio visitado, la ruta actual, los nombres de sus subdirectorios y los nombres de sus archivos. Une la ruta actual con cada nombre de archivo para construir una ruta. Los ejemplos muestran archivos, no todas las entradas de los directorios.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
from pathlib import Path
import os
import tempfile
with tempfile.TemporaryDirectory() as temporary_directory:
root = Path(temporary_directory) / "project"
(root / "reports").mkdir(parents=True)
for relative_path in ("notes", "data.csv", "reports/summary.txt", "reports/2025.csv"):
(root / relative_path).write_text("sample", encoding="utf-8")
for current, directories, filenames in os.walk(root):
directories.sort()
for filename in sorted(filenames):
print(Path(current, filename).relative_to(root))
data.csv
notes
reports/2025.csv
reports/summary.txt
Este ejemplo temporal crea su propio árbol de directorios, incluido un archivo sin extensión, e imprime rutas relativas al directorio inicial. Para construir rutas completas, usa Path(current, filename) o os.path.join(current, filename). Una ruta relativa resulta práctica al guardar los resultados; una ruta absoluta es útil al pasar archivos a otro código. El separador de rutas depende del sistema operativo actual.
Usa os.walk() para listar archivos de forma recursiva
El bucle anterior usa os.walk() como opción predeterminada para listar archivos de forma recursiva. En cada iteración, el primer valor es la ruta del directorio actual; el segundo, una lista modificable con los nombres de sus subdirectorios; y el tercero, los nombres de los archivos de ese directorio. Itera sobre el tercer valor para no incluir directorios. Ordena los nombres de los subdirectorios si necesitas que el recorrido siga un orden estable. De forma predeterminada, se ignoran los errores de recorrido; proporciona onerror si tu aplicación necesita notificarlos.
Usa os.listdir() para implementar un recorrido recursivo personalizado
os.listdir(path) devuelve los nombres de las entradas de un único directorio; no visita sus subdirectorios. Para implementar un recorrido personalizado, mantén una pila de rutas pendientes de inspección. Para cada ruta, itera sobre os.listdir(path), une cada nombre con su directorio padre mediante os.path.join(), añade los archivos al resultado y agrega los directorios a la pila. Comprueba las entradas con os.path.isfile() y os.path.isdir(). Este enfoque permite controlar el orden del recorrido y los filtros, pero tendrás que implementar la recursión y gestionar los errores del sistema de archivos.
Usa os.scandir() para inspeccionar las entradas de un directorio
os.scandir(path) devuelve objetos DirEntry de un único directorio. Sus métodos is_file() e is_dir() facilitan decidir qué entradas recopilar y si hay que visitar un subdirectorio. Aplica el mismo recorrido basado en una pila descrito antes y abre cada directorio con with os.scandir(path) as entries: para asegurarte de que el iterador se cierre correctamente. Este método resulta útil cuando el tipo o los metadatos de una entrada influyen en la decisión.
Usa glob.glob() para buscar archivos según un patrón
Para seleccionar archivos por patrón, glob.glob(os.path.join(root, "**", "*"), recursive=True) busca nombres a cualquier profundidad, incluidos los que no tienen extensión. El componente ** abarca directorios cuando se activa recursive=True. Los resultados de glob pueden incluir directorios, así que, si solo necesitas archivos, fíltralos con os.path.isfile(path). Usa un patrón más específico, como "**/*.csv", para seleccionar un tipo de archivo; "*.*" excluye los nombres que no contienen un punto.
Usa pathlib.Path para listar archivos de forma recursiva
pathlib.Path(root).rglob("*") devuelve de forma recursiva las rutas que hay bajo la raíz. Filtra los resultados con path.is_file() para excluir los directorios. Los objetos devueltos son instancias de Path, por lo que puedes usar métodos como relative_to(root) y name sin unir cadenas manualmente. Usa str(path) si una API requiere una ruta en forma de cadena.
Elige el método según la tarea
Elige os.walk() como opción clara y directa cuando quieras obtener por separado los nombres de los archivos y los subdirectorios. Elige os.scandir() si necesitas inspeccionar el tipo o los metadatos de las entradas durante el recorrido. Usa glob.glob() para buscar según un patrón y pathlib.Path.rglob() si trabajas con objetos de ruta. Elige os.listdir() cuando necesites definir una política de recorrido personalizada y estés preparado para implementarla. Estos métodos devuelven rutas o nombres, no el contenido de los archivos; abre cada ruta por separado para leer o procesar un archivo. Si el directorio inicial no existe o no se puede leer, gestiona los errores del sistema de archivos según la API y el comportamiento que requiera tu aplicación.