PurePath.full_match: valida rutas con patrones glob

Publicado el: 15/09/2026
Tempo de leitura: 6 minutos
Código y rutas de archivos para PurePath.full_match en Python

PurePath.full_match permite comprobar si una ruta completa coincide con un patrón de estilo glob. Es útil cuando una aplicación necesita validar nombres de archivos, estructuras de carpetas, extensiones o rutas lógicas sin acceder al sistema de archivos. Como analiza el valor completo, evita coincidencias parciales que pueden volver un filtro demasiado permisivo.

En esta guía verás cómo funciona, qué patrones acepta, en qué se diferencia de match, cómo controlar mayúsculas y minúsculas, cómo trabajar con rutas POSIX y Windows y cómo aplicarlo en validadores, uploads, pruebas y pipelines.

Qué hace PurePath.full_match

PurePath representa una ruta de forma lógica. No comprueba si el archivo existe, por lo que resulta ideal para APIs, analizadores, manifiestos, archivos comprimidos, pruebas y datos recibidos de otros sistemas.

from pathlib import PurePath
ruta = PurePath("datos/2026/informe.csv")
print(ruta.full_match("datos/**/*.csv"))

El resultado es verdadero porque el patrón describe toda la ruta. No se abre ninguna carpeta ni se consulta información del disco.

Por qué importa la coincidencia completa

Una verificación como endswith('.csv') confirma la extensión, pero no garantiza que el archivo esté dentro del directorio permitido. Una expresión regular puede hacerlo, aunque normalmente exige más escapes y reglas específicas para cada plataforma. Un patrón glob suele ser más legible.

from pathlib import PurePath
valores = [
    PurePath("entrada/clientes.csv"),
    PurePath("entrada/2026/ventas.csv"),
    PurePath("backup/ventas.csv"),
]
for elemento in valores:
    if elemento.full_match("entrada/**/*.csv"):
        print("aceptado:", elemento)

Solo se aceptan rutas que cumplen toda la estructura definida. Esto mejora importadores, procesadores de adjuntos, sistemas de compilación y herramientas de consola.

Patrones glob esenciales

Un asterisco simple coincide con caracteres dentro de un componente. El signo de interrogación representa un carácter. Las expresiones entre corchetes describen conjuntos o rangos. El doble asterisco puede atravesar varios niveles de carpetas.

from pathlib import PurePath
ejemplos = [
    ("logs/app.log", "logs/*.log"),
    ("img/foto1.png", "img/foto?.png"),
    ("datos/a.csv", "datos/[ab].csv"),
    ("src/pkg/modulo.py", "src/**/*.py"),
]
for valor, patron in ejemplos:
    print(valor, PurePath(valor).full_match(patron))

Las reglas quedan cercanas a la forma en que una persona describe grupos de archivos y son fáciles de revisar.

Diferencia entre full_match y match

PurePath.match tiene un comportamiento histórico que puede evaluar patrones relativos desde la parte derecha de una ruta. Eso es cómodo para búsquedas flexibles, pero puede sorprender cuando la regla debe validar toda la entrada. full_match expresa una intención más estricta.

from pathlib import PurePath
p = PurePath("proyecto/src/app.py")
print(p.match("src/*.py"))
print(p.full_match("src/*.py"))
print(p.full_match("proyecto/src/*.py"))

Usa full_match cuando el patrón sea un contrato para todo el valor. Usa match cuando busques una coincidencia más flexible o compatibilidad con código anterior.

Sensibilidad a mayúsculas

El argumento opcional case_sensitive permite definir el comportamiento. Si se omite, el valor predeterminado depende de la familia de ruta. Las rutas POSIX normalmente distinguen mayúsculas; las rutas Windows normalmente no.

from pathlib import PurePosixPath
archivo = PurePosixPath("Imagenes/Foto.PNG")
print(archivo.full_match("imagenes/*.png"))
print(archivo.full_match("imagenes/*.png", case_sensitive=False))

Definir esta opción explícitamente evita que las pruebas produzcan resultados diferentes en Linux y Windows.

PurePosixPath y PureWindowsPath

Puedes analizar rutas de otra plataforma sin depender del sistema operativo actual. PurePosixPath entiende barras normales. PureWindowsPath entiende unidades, barras invertidas y convenciones de Windows.

from pathlib import PurePosixPath, PureWindowsPath
web = PurePosixPath("assets/css/site.css")
win = PureWindowsPath(r"C:\Proyectos\app\main.py")
print(web.full_match("assets/**/*.css"))
print(win.full_match(r"C:\Proyectos\**\*.py"))

Esto ayuda al procesar manifiestos remotos, entradas de ZIP, configuraciones y metadatos de compilación.

Validación de uploads

La coincidencia completa puede formar parte de una política de uploads. No sustituye la inspección MIME, los límites de tamaño, el análisis del contenido ni el control seguro del destino, pero restringe ubicaciones lógicas y extensiones.

from pathlib import PurePosixPath
PATRON = "uploads/**/*.csv"
def permitido(valor: str) -> bool:
    ruta = PurePosixPath(valor)
    return ruta.full_match(PATRON, case_sensitive=False)

También debes rechazar componentes que suban al directorio padre y resolver el destino final con seguridad. Para ampliar el tema, consulta pathlib.Path.walk en Python.

Clasificación en pipelines

Un diccionario de patrones permite clasificar artefactos sin condicionales anidados.

from pathlib import PurePath
REGLAS = {
    "entrada": "data/incoming/**/*.json",
    "procesado": "data/processed/**/*.parquet",
    "log": "logs/**/*.log",
}
def clasificar(valor: str) -> str | None:
    ruta = PurePath(valor)
    for nombre, patron in REGLAS.items():
        if ruta.full_match(patron, case_sensitive=False):
            return nombre
    return None

Este diseño combina bien con recorridos descritos en os.fwalk en Python y con herramientas empaquetadas mediante zipapp en Python.

Errores comunes

El primer error es olvidar que la coincidencia es completa. Un patrón como *.py puede no describir una ruta con varias carpetas. Incluye el prefijo o usa **/*.py cuando se permitan niveles intermedios.

El segundo error es mezclar separadores y semánticas. Usa la clase de ruta pura correspondiente a los datos analizados.

El tercer error es considerar el glob como una barrera de seguridad completa. Valida la forma de la ruta, no el contenido, los permisos ni el destino real.

Pruebas automatizadas

Las rutas puras permiten pruebas rápidas porque no requieren carpetas temporales.

from pathlib import PurePosixPath
def permitido(valor: str) -> bool:
    return PurePosixPath(valor).full_match(
        "informes/**/*.csv",
        case_sensitive=False,
    )
def test_valido():
    assert permitido("informes/2026/enero.csv")
def test_extension_invalida():
    assert not permitido("informes/2026/enero.exe")
def test_carpeta_invalida():
    assert not permitido("privado/enero.csv")

Para contratos más claros, revisa typing.override en Python y dataclasses.KW_ONLY en Python.

Compatibilidad de versiones

Comprueba la versión mínima de Python de tu proyecto antes de adoptar una API reciente. Si debes soportar entornos antiguos, encapsula la operación en una función pequeña y prueba la alternativa por separado.

from pathlib import PurePath
def coincide(ruta: str, patron: str) -> bool:
    objeto = PurePath(ruta)
    metodo = getattr(objeto, "full_match", None)
    if metodo is None:
        raise RuntimeError("PurePath.full_match no está disponible")
    return metodo(patron)

La documentación oficial de pathlib es la referencia principal. La documentación de fnmatch ayuda a comprender los patrones.

Recomendaciones de diseño

Centraliza los patrones, asígnales nombres según la intención del negocio y añade ejemplos positivos y negativos a las pruebas. Define la sensibilidad a mayúsculas cuando la regla deba ser portátil. Convierte entradas externas a una familia de ruta conocida en lugar de depender de la plataforma anfitriona.

Cuando un patrón sea demasiado amplio, divídelo en varias reglas con nombres claros. Es más fácil auditar varias reglas simples que una expresión compleja. Si la decisión depende de metadatos o contenido, realiza esas verificaciones después del filtro lógico.

Uso en herramientas de línea de comando

Una CLI puede aceptar una lista de rutas y patrones, convertirlos a PurePath y mostrar qué elementos serán procesados antes de ejecutar cambios. Esa vista previa reduce errores humanos. También puedes almacenar los patrones en configuración, validarlos al iniciar y registrar qué regla aceptó cada archivo.

Evita incluir rutas privadas completas en logs públicos. En sistemas multiusuario, registra identificadores o rutas relativas controladas. La claridad del patrón no elimina la necesidad de permisos y aislamiento.

Conclusión

PurePath.full_match ofrece una forma legible de comprobar que una ruta lógica completa sigue un patrón glob. Evita comparaciones frágiles con strings, no accede al disco, permite controlar mayúsculas y funciona con semántica POSIX o Windows.

Úsalo en contratos de rutas, clasificación de artefactos, uploads, sistemas de compilación y filtros multiplataforma. Mantén patrones específicos y combínalos con validaciones de contenido, permisos y destino cuando la entrada no sea confiable.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Código asíncrono que representa asyncio.eager_task_factory en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    asyncio.eager_task_factory: reduce overhead de tareas

    Aprende asyncio.eager_task_factory en Python para reducir overhead, entender cambios de orden y optimizar corrutinas cortas con seguridad.

    Ler mais

    Tempo de leitura: 5 minutos
    14/09/2026
    Desarrollador trabajando con timestamps UTC y calendar.timegm en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    calendar.timegm: convierte UTC a timestamp Unix

    Aprende calendar.timegm en Python para convertir fechas UTC en timestamps Unix y evitar errores de zona horaria y unidades.

    Ler mais

    Tempo de leitura: 6 minutos
    14/09/2026
    Programador analizando código para identificar tipos MIME de archivos con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    mimetypes.guess_file_type: detecta tipos MIME

    Aprende mimetypes.guess_file_type en Python para detectar tipos MIME en rutas, URLs, uploads y respuestas HTTP con fallbacks seguros.

    Ler mais

    Tempo de leitura: 4 minutos
    13/09/2026
    Componentes de servidor que representan intérpretes Python aislados ejecutándose en paralelo
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    InterpreterPoolExecutor: paralelismo real en Python

    Aprende InterpreterPoolExecutor en Python para tareas CPU-bound, intérpretes aislados, paralelismo real y concurrencia segura.

    Ler mais

    Tempo de leitura: 6 minutos
    13/09/2026
    Microprocesador que representa las CPU disponibles para un proceso Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    os.process_cpu_count: cuenta CPUs disponibles

    Aprende os.process_cpu_count en Python para dimensionar workers según las CPU disponibles para el proceso.

    Ler mais

    Tempo de leitura: 4 minutos
    12/09/2026
    Portátil con código digital que representa datos BLOB en SQLite
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    sqlite3.Blob: lee BLOBs sin cargar todo en memoria

    Aprende sqlite3.Blob en Python para leer y escribir BLOBs por partes, reducir memoria y manejar datos binarios en SQLite.

    Ler mais

    Tempo de leitura: 5 minutos
    12/09/2026