pathlib.Path.info: caché de metadatos de archivos

Publicado el: 01/10/2026
Tempo de leitura: 5 minutos
Estructura de archivos y código para pathlib.Path.info en Python

pathlib.Path.info en Python permite consultar de forma eficiente qué representa una ruta: un archivo, un directorio, un enlace simbólico u otro tipo de entrada del sistema de archivos. Es especialmente útil en inventarios, backups, indexadores, herramientas de compilación, procesadores por lotes y aplicaciones que deben clasificar miles de rutas sin repetir llamadas costosas al sistema operativo.

La idea central es reutilizar información. Cuando una iteración de directorio ya obtuvo metadatos básicos, Python puede conservarlos para responder consultas relacionadas. Así, el código mantiene la API orientada a objetos de pathlib y puede evitar operaciones redundantes.

Qué representa Path.info

Path.info agrupa consultas sobre existencia y tipo. Está asociado a un objeto Path y reduce la necesidad de mezclar os.path, llamadas manuales a stat y condiciones específicas de plataforma.

El beneficio aparece sobre todo después de recorrer un directorio. Muchos sistemas entregan información de tipo junto con cada entrada. Reutilizar esos datos puede ahorrar consultas en discos de red, volúmenes externos, contenedores y árboles grandes.

Ejemplo básico

from pathlib import Path

ruta = Path("datos/informe.csv")

if ruta.info.exists():
    if ruta.info.is_file():
        print("Es un archivo")
    elif ruta.info.is_dir():
        print("Es un directorio")

La inspección no abre el archivo ni garantiza que una lectura posterior tendrá éxito. Para leer, escribir, mover o eliminar, siguen siendo necesarios los métodos normales de Path y el tratamiento de excepciones.

Iteración de directorios

from pathlib import Path

raiz = Path("proyecto")

for entrada in raiz.iterdir():
    if entrada.info.is_dir():
        print("Directorio:", entrada.name)
    elif entrada.info.is_file():
        print("Archivo:", entrada.name)
    elif entrada.info.is_symlink():
        print("Enlace:", entrada.name)

Este es el caso más natural. En una carpeta con muchas entradas, evitar consultas repetidas puede marcar diferencia. El resultado depende del sistema operativo, el formato del disco, la latencia y el estado de las cachés, por lo que conviene medir.

Caché y datos desactualizados

La información puede quedar almacenada. Si otro proceso elimina o reemplaza un archivo, el objeto existente puede conservar una respuesta anterior. Debes tratar los datos como una fotografía del estado conocido y no como una garantía permanente.

from pathlib import Path

original = Path("entrada.txt")
print(original.info.exists())

# Después de posibles cambios externos
actual = Path(original)
print(actual.info.exists())

Esta diferencia es importante en watchers, colas, uploads y servicios concurrentes. El estado puede cambiar entre la comprobación y el uso, una condición conocida como TOCTOU.

Comprobar no significa tener permiso

Que una ruta sea un archivo no implica que el proceso pueda leerla. Los permisos pueden cambiar, el archivo puede desaparecer o el directorio padre puede volverse inaccesible.

from pathlib import Path

archivo = Path("config.toml")

if archivo.info.is_file():
    try:
        texto = archivo.read_text(encoding="utf-8")
    except OSError as error:
        print("No se pudo leer:", error)

La operación real debe considerarse la validación final. Las comprobaciones previas sirven para decidir flujo y mejorar mensajes, no para sustituir el manejo de errores.

Enlaces simbólicos

Con enlaces hay dos preguntas: si la propia ruta es un enlace y qué tipo tiene su destino. Algunas operaciones siguen el enlace y otras inspeccionan la entrada. Revisa la documentación de la versión exacta de Python.

En backups y sincronización define una política explícita: ignorar enlaces, conservarlos o seguir solo destinos dentro de una raíz aprobada. Seguir enlaces sin control puede sacar el proceso del árbol esperado.

Inventario de un directorio

from pathlib import Path


def inventario(raiz: Path) -> dict[str, int]:
    totales = {
        "archivos": 0,
        "directorios": 0,
        "enlaces": 0,
        "otros": 0,
    }

    for entrada in raiz.iterdir():
        if entrada.info.is_symlink():
            totales["enlaces"] += 1
        elif entrada.info.is_file():
            totales["archivos"] += 1
        elif entrada.info.is_dir():
            totales["directorios"] += 1
        else:
            totales["otros"] += 1

    return totales

La función clasifica un nivel. Para recorridos profundos utiliza una pila o cola y decide cómo manejar errores, enlaces y directorios enormes.

Recorrido recursivo iterativo

from pathlib import Path


def listar_archivos(raiz: Path):
    pendientes = [raiz]

    while pendientes:
        actual = pendientes.pop()
        try:
            entradas = actual.iterdir()
        except OSError:
            continue

        for entrada in entradas:
            if entrada.info.is_symlink():
                continue
            if entrada.info.is_dir():
                pendientes.append(entrada)
            elif entrada.info.is_file():
                yield entrada

Este diseño evita límites de recursión y no carga toda la lista en memoria. En producción registra errores, soporta cancelación y limita el trabajo cuando el árbol no es confiable.

Medir el rendimiento

No supongas que la caché mejora todo por igual. Las cachés del kernel, la red, el almacenamiento y la implementación influyen.

from pathlib import Path
from time import perf_counter

raiz = Path("dataset")
inicio = perf_counter()
cantidad = sum(1 for p in raiz.iterdir() if p.info.is_file())
tiempo = perf_counter() - inicio
print(cantidad, tiempo)

Ejecuta varias rondas, descarta calentamientos y compara implementaciones equivalentes. Una carpeta pequeña no representa un árbol de producción.

Compatibilidad de versiones

Path.info es reciente. Una biblioteca compatible con versiones anteriores necesita fallback.

from pathlib import Path


def es_archivo(ruta: Path) -> bool:
    info = getattr(ruta, "info", None)
    if info is not None:
        return info.is_file()
    return ruta.is_file()

Centraliza la compatibilidad y declara la versión mínima en pyproject.toml. La matriz de CI debe probar cada versión soportada.

Combinar con patrones

La clasificación funciona bien con glob, rglob, sufijos y filtros. Consulta las guías de Academify sobre pathlib en Python, glob en Python, el módulo os y manejo de excepciones.

from pathlib import Path

for entrada in Path("logs").glob("*.log"):
    if entrada.info.is_file():
        print(entrada)

Una extensión no garantiza un archivo normal. Un directorio, enlace, socket u otra entrada puede usar el mismo nombre.

Entradas especiales

Unix puede representar sockets, FIFO y dispositivos como rutas. Si la aplicación espera archivos normales, rechaza otros tipos. Leer un FIFO puede bloquear y acceder a dispositivos puede tener efectos graves.

En servicios que procesan archivos, una lista permitida es más segura: aceptar archivos regulares y directorios conocidos, y rechazar lo demás.

Rutas controladas por usuarios

Path.info no evita path traversal. Resuelve la ruta candidata contra una raíz aprobada y confirma que permanece dentro.

from pathlib import Path

RAIZ = Path("uploads").resolve()


def ruta_segura(nombre: str) -> Path:
    destino = (RAIZ / nombre).resolve()
    if destino != RAIZ and RAIZ not in destino.parents:
        raise ValueError("Ruta fuera de la raíz permitida")
    return destino

Después, trata igualmente los errores de la operación real. Consulta la documentación oficial de pathlib y os.

Pruebas

Crea directorios temporales con archivos, subdirectorios, enlaces rotos y casos de permisos. Verifica clasificación, fallback y eliminación entre comprobación y lectura. Las pruebas no deben depender de la máquina del desarrollador.

from pathlib import Path


def nombres_regulares(raiz: Path) -> list[str]:
    return sorted(
        entrada.name
        for entrada in raiz.iterdir()
        if entrada.info.is_file()
    )

Cuándo usar Path.info

Úsalo al clasificar muchas entradas, especialmente las generadas por iteración. Es útil en inventarios, procesadores, builds, generadores de sitios, exploradores y backups.

Para una comprobación aislada, Path.is_file() o Path.is_dir() pueden ser más simples. Decide según claridad, compatibilidad y mediciones.

Errores frecuentes

Los errores habituales son confiar indefinidamente en datos almacenados, ignorar TOCTOU, seguir enlaces sin política, no capturar OSError, asumir compatibilidad con versiones antiguas y tratar metadatos como frontera de seguridad.

Separa responsabilidades: validar raíz, clasificar entrada, ejecutar operación y manejar fallos. Las funciones pequeñas facilitan pruebas.

Conclusión

pathlib.Path.info hace expresiva la clasificación y puede reutilizar metadatos obtenidos durante la iteración. Esto reduce llamadas redundantes en recorridos grandes. La caché exige cuidado: el sistema cambia, los permisos varían y los enlaces pueden conducir fuera del destino. Combina el recurso con excepciones, validación, reglas explícitas para enlaces, fallback de versiones y benchmarks realistas para obtener rendimiento sin perder corrección ni seguridad.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Código Python que representa functools.Placeholder y argumentos posicionales
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    functools.Placeholder: argumentos flexibles en partial

    Aprende functools.Placeholder en Python 3.14 para crear llamadas parciales flexibles con argumentos posicionales abiertos.

    Ler mais

    Tempo de leitura: 6 minutos
    17/10/2026
    Código en una pantalla que representa t-strings en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    T-strings en Python 3.14: templates estructurados

    Aprende t-strings en Python 3.14, explora Template e Interpolation y crea renderizadores estructurados, extensibles y seguros.

    Ler mais

    Tempo de leitura: 6 minutos
    16/10/2026
    CPU y módulos de memoria que representan shared_memory track en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    shared_memory track: controla el resource tracker

    Aprende shared_memory track en Python para controlar el resource tracker, la propiedad y la limpieza entre procesos.

    Ler mais

    Tempo de leitura: 5 minutos
    16/10/2026
    Unidad de almacenamiento de datos que representa compression.zstd en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    compression.zstd: streaming y compresión segura

    Aprende compression.zstd en Python para comprimir archivos y datos con velocidad, streaming, diccionarios y límites seguros.

    Ler mais

    Tempo de leitura: 7 minutos
    15/10/2026
    Código en pantalla para diagnosticar procesos con sys.remote_exec en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    sys.remote_exec: diagnostica procesos Python

    Aprende sys.remote_exec en Python para diagnosticar procesos activos con scripts controlados, permisos seguros y buenas prácticas.

    Ler mais

    Tempo de leitura: 7 minutos
    15/10/2026
    Código Python y configuración de variables de entorno con os.reload_environ
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    os.reload_environ: threads y variables de entorno

    Aprende os.reload_environ en Python para actualizar variables de entorno externas con validación, compatibilidad y precauciones de concurrencia.

    Ler mais

    Tempo de leitura: 5 minutos
    14/10/2026