os.path.splitroot: separa unidad, raíz y ruta

Publicado el: 25/09/2026
Tempo de leitura: 4 minutos
Estructura de archivos y código para os.path.splitroot en Python

os.path.splitroot() separa una ruta en tres componentes: unidad, raíz y resto. Es una función especialmente útil cuando una aplicación debe comprender rutas de Windows, POSIX y recursos UNC sin depender de divisiones manuales de cadenas. Interpretar bien estas partes evita errores de validación, normalización, registro y construcción de rutas.

En esta guía aprenderás qué devuelve la función, cómo tratar rutas absolutas y relativas, letras de unidad, recursos de red, seguridad, compatibilidad y cuándo conviene usar pathlib.

Qué devuelve splitroot

La función devuelve una tupla (drive, root, tail). drive identifica una unidad o un recurso compartido. root contiene los separadores que anclan la ruta. tail contiene el resto.

import os

print(os.path.splitroot('/usr/local/bin/python'))
# ('', '/', 'usr/local/bin/python')

Esta estructura respeta las reglas de la plataforma y es mucho más segura que dividir la cadena por la primera barra.

Rutas POSIX

En Linux y macOS, la unidad normalmente está vacía. Una ruta absoluta suele tener root='/', mientras que una ruta relativa tiene una raíz vacía.

rutas = [
    '/var/log/app.log',
    'datos/informe.csv',
    './config.toml',
]

for ruta in rutas:
    print(ruta, os.path.splitroot(ruta))

Esta diferencia importa antes de borrar, mover o reemplazar archivos. Una ruta relativa depende del directorio de trabajo actual, que puede cambiar entre el entorno local, un servicio, una tarea programada y un contenedor.

Unidades de Windows

Las rutas de Windows pueden incluir una unidad como C:. La presencia de una barra de raíz determina si la ruta es absoluta dentro de esa unidad.

import ntpath

print(ntpath.splitroot(r'C:\Users\Ana\archivo.txt'))
# ('C:', '\\', 'Users\\Ana\\archivo.txt')

print(ntpath.splitroot(r'C:archivo.txt'))
# ('C:', '', 'archivo.txt')

C:archivo.txt no equivale a C:\archivo.txt. La primera forma es relativa al directorio actual de la unidad C. Confundirlas puede llevar al programa a leer o escribir en una ubicación inesperada.

Rutas UNC

Los recursos de red de Windows usan rutas UNC como \\servidor\datos\proyecto\app.py. El servidor y el recurso compartido pueden formar parte de drive.

ruta = r'\\servidor\datos\proyecto\app.py'
print(ntpath.splitroot(ruta))

Esto resulta útil para listas permitidas, auditorías, backups y aplicaciones que deben rechazar servidores o recursos no autorizados.

Diferencia frente a splitdrive

splitdrive() devuelve solo la unidad y el resto. splitroot() también separa la raíz.

drive, resto = os.path.splitdrive(ruta)
drive, root, tail = os.path.splitroot(ruta)

Usa splitdrive cuando solo importe la unidad. Usa splitroot cuando necesites distinguir entre una parte anclada y una parte relativa.

Reconstruir una ruta

Para análisis, concatenar las tres partes suele reproducir la ruta original.

drive, root, tail = os.path.splitroot('/opt/app/config.ini')
assert drive + root + tail == '/opt/app/config.ini'

Para crear rutas nuevas, prefiere os.path.join() o pathlib. Añadir separadores manualmente genera errores fáciles de pasar por alto.

Comprobar rutas absolutas

La raíz ofrece una pista, pero os.path.isabs() expresa mejor la intención.

def exigir_absoluta(ruta):
    drive, root, tail = os.path.splitroot(ruta)
    if not os.path.isabs(ruta):
        raise ValueError('La ruta debe ser absoluta')
    return drive, root, tail

Una ruta absoluta no es necesariamente segura. También debes comprobar una carpeta base o un recurso de red permitido.

Evitar path traversal

splitroot no elimina componentes ... Cuando la entrada procede de usuarios, archivos ZIP, APIs o configuraciones, resuélvela dentro de una base confiable y verifica que no escape.

from pathlib import Path

base = Path('/srv/uploads').resolve()
destino = (base / entrada_usuario).resolve()

if base not in destino.parents and destino != base:
    raise ValueError('Ruta fuera del directorio permitido')

Esta validación es esencial en uploads, extracción de archivos, servidores de contenido y administradores de archivos.

Analizar sintaxis de otra plataforma

Un servidor Linux puede recibir rutas creadas por clientes Windows. Usa ntpath.splitroot() para sintaxis Windows y posixpath.splitroot() para sintaxis POSIX.

import ntpath
import posixpath

print(ntpath.splitroot(r'D:\app\main.py'))
print(posixpath.splitroot('/home/app/main.py'))

Así el resultado no depende del sistema operativo donde se ejecuta el código.

Ejemplo con un manifiesto

Un servicio de compilación puede recibir un manifiesto con rutas de distintos agentes y clasificarlas antes de procesarlas.

def clasificar(ruta, estilo='posix'):
    modulo = ntpath if estilo == 'windows' else posixpath
    drive, root, tail = modulo.splitroot(ruta)
    return {
        'drive': drive,
        'absoluta': bool(root),
        'resto': tail,
    }

El servicio puede rechazar rutas absolutas, unidades no permitidas, recursos UNC o valores vacíos antes de acceder al disco.

Cuándo usar pathlib

pathlib ofrece operaciones orientadas a objetos para unir, resolver, abrir y renombrar rutas. Suele ser la mejor opción para código de aplicación. splitroot sigue siendo valioso cuando importa la estructura textual exacta, cuando no quieres tocar el disco o cuando debes analizar varias sintaxis.

Consulta también nuestros contenidos sobre pathlib en Python, el módulo os, FileNotFoundError y PermissionError.

Pruebas recomendadas

Prueba cadenas vacías, rutas relativas, rutas POSIX absolutas, rutas Windows relativas a una unidad, rutas absolutas, UNC, separadores repetidos, espacios y caracteres Unicode. Prueba ntpath y posixpath por separado.

assert ntpath.splitroot(r'C:\temp\a.txt') == ('C:', '\\', r'temp\a.txt')
assert ntpath.splitroot(r'C:a.txt') == ('C:', '', 'a.txt')
assert posixpath.splitroot('/tmp/a.txt') == ('', '/', 'tmp/a.txt')

Compatibilidad

Comprueba la versión mínima de Python del proyecto. Si necesitas soportar versiones antiguas, puedes crear una función de compatibilidad basada en splitdrive() y extracción de raíz. Documenta los casos límite y añade pruebas específicas por plataforma.

Rendimiento

La separación de rutas es barata en comparación con el acceso al sistema de archivos. En índices muy grandes, evita analizar repetidamente la misma ruta, pero prioriza la corrección y la claridad.

Errores frecuentes

Los errores más comunes son considerar C:archivo.txt como absoluto, asumir que una barra significa lo mismo en todos los sistemas, concatenar separadores manualmente, confiar en una ruta normalizada sin comprobar su base y analizar rutas Windows con reglas POSIX.

Referencias oficiales

Consulta la documentación oficial de os.path y la documentación oficial de pathlib.

Conclusión

os.path.splitroot ofrece una representación precisa de la unidad, la raíz y el resto de una ruta. Es útil en validaciones, herramientas multiplataforma, recursos UNC y registros. Combínala con isabs, una base confiable, os.path.join o pathlib para crear flujos de archivos portables y seguros.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Código y estructura de archivos para filtros con glob.translate en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    glob.translate: convierte patrones glob a regex

    Aprende glob.translate en Python para convertir patrones glob en regex y filtrar rutas con recursión, separadores y seguridad.

    Ler mais

    Tempo de leitura: 5 minutos
    24/09/2026
    Código Python con anotaciones y type hints en un portátil
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    annotationlib: resuelve anotaciones diferidas

    Aprende annotationlib en Python para recuperar anotaciones, referencias futuras y type hints con mayor seguridad.

    Ler mais

    Tempo de leitura: 7 minutos
    24/09/2026
    Persona programando en Python con SQLite y dbm.sqlite3
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    dbm.sqlite3: clave-valor con SQLite en Python

    Aprende dbm.sqlite3 en Python para almacenar pares clave-valor con SQLite, migrar datos, controlar concurrencia y medir rendimiento.

    Ler mais

    Tempo de leitura: 6 minutos
    23/09/2026
    Desarrollador trabajando con tareas asíncronas y TaskGroup eager_start en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    TaskGroup eager_start: controla el inicio de tareas

    Aprende a usar eager_start en asyncio.TaskGroup para controlar el inicio de tareas, la ejecución inmediata, el orden y la compatibilidad.

    Ler mais

    Tempo de leitura: 7 minutos
    23/09/2026
    Desarrolladora trabajando con tipado estático y typing.ReadOnly en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    typing.ReadOnly: campos de solo lectura en TypedDict

    Aprende typing.ReadOnly en Python para declarar claves de solo lectura en TypedDict y crear contratos de datos más seguros.

    Ler mais

    Tempo de leitura: 6 minutos
    22/09/2026
    Código Python que representa argumentos posicionales con functools.Placeholder
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    functools.Placeholder: argumentos medios en partial

    Aprende functools.Placeholder en Python para reservar argumentos intermedios en partial y crear callbacks y adaptadores más claros.

    Ler mais

    Tempo de leitura: 6 minutos
    22/09/2026