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

    Portátil con material de pruebas en Python para loop_factory y asyncio
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    loop_factory: aísla event loops en pruebas asyncio

    Aprende loop_factory en IsolatedAsyncioTestCase para pruebas asyncio aisladas, predecibles y con limpieza segura.

    Ler mais

    Tempo de leitura: 5 minutos
    30/09/2026
    Desarrolladora navegando archivos ZIP con zipfile.Path en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    zipfile.Path: navega ZIPs sin extraer archivos

    Aprende zipfile.Path en Python para navegar, leer y validar archivos dentro de ZIPs sin extraer todo.

    Ler mais

    Tempo de leitura: 4 minutos
    30/09/2026
    Programador trabajando con encabezados de correo en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    email.headerregistry: headers de correo seguros

    Aprende email.headerregistry en Python para encabezados, direcciones, grupos, fechas, parámetros y análisis seguro de correos.

    Ler mais

    Tempo de leitura: 5 minutos
    29/09/2026
    Terminal de computadora usado con pseudoterminales os.unlockpt en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    os.unlockpt: controla pseudoterminales en Python

    Aprende os.unlockpt en Python para crear pseudoterminales, controlar subprocesos interactivos y gestionar descriptores con seguridad.

    Ler mais

    Tempo de leitura: 7 minutos
    29/09/2026
    Código Python para colas con hilos y gestión de queue.ShutDown
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    queue.ShutDown: cierra colas y workers con seguridad

    Aprende queue.ShutDown en Python para cerrar colas con hilos, liberar workers y evitar bloqueos.

    Ler mais

    Tempo de leitura: 6 minutos
    28/09/2026
    Código Python que representa filtros de valores None con operator.is_none
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    operator.is_none: filtra None en pipelines Python

    Aprende operator.is_none en Python para filtrar None sin eliminar cero, False o cadenas vacías.

    Ler mais

    Tempo de leitura: 5 minutos
    28/09/2026