os.listdrives: lista unidades de Windows en Python

Publicado el: 04/10/2026
Tempo de leitura: 5 minutos
Programadora trabajando en automatización de unidades de Windows con Python

Las aplicaciones Python ejecutadas en Windows a menudo necesitan descubrir qué unidades están disponibles antes de buscar archivos, crear copias de seguridad o mostrar opciones de almacenamiento. Python ofrece os.listdrives(), una función específica que devuelve las raíces de las unidades conocidas por el sistema.

Este recurso evita soluciones frágiles basadas en probar letras de la A a la Z, ejecutar comandos del terminal o depender de bibliotecas externas. En esta guía aprenderás qué devuelve la función, cómo comprobar la plataforma, cómo combinarla con pathlib, cómo tratar unidades extraíbles y de red, cómo validar rutas y cómo escribir pruebas seguras.

Qué devuelve os.listdrives

La función devuelve una lista de cadenas con rutas absolutas que representan las raíces de las unidades. Un resultado típico puede incluir C:\, D:\ y otras letras asignadas a particiones, memorias USB, lectores ópticos o unidades de red mapeadas.

import os
for unidad in os.listdrives():
    print(unidad)

Que una unidad aparezca en la lista no garantiza que el acceso funcione. Un dispositivo extraíble puede ser retirado, una unidad de red puede estar desconectada y los permisos pueden impedir la lectura.

Disponibilidad por plataforma

os.listdrives() es específico de Windows. El código multiplataforma debe comprobar el sistema operativo antes de llamar a la función.

import os
import sys

if sys.platform == "win32":
    raices = os.listdrives()
else:
    raices = ["/"]

Linux y macOS trabajan con puntos de montaje en lugar de letras de unidad. Mantener esta lógica en una función pequeña facilita el mantenimiento.

Convertir a objetos Path

pathlib.Path simplifica la composición, validación y exploración de rutas.

from pathlib import Path
import os

raices = [Path(valor) for valor in os.listdrives()]
for raiz in raices:
    print(raiz, raiz.exists())

La comprobación adicional es útil porque el estado del dispositivo puede cambiar después de obtener la lista.

Comprobar espacio disponible

Una herramienta de backup suele necesitar conocer la capacidad libre. Combina las unidades con shutil.disk_usage().

import os
import shutil

for raiz in os.listdrives():
    try:
        total, usado, libre = shutil.disk_usage(raiz)
    except OSError as error:
        print(raiz, "no disponible:", error)
        continue
    print(raiz, libre // (1024 ** 3), "GB libres")

El manejo de OSError es esencial para dispositivos extraíbles, lectores sin medio y conexiones de red inestables.

Unidades extraíbles

Una memoria USB puede desaparecer después de crear la lista. No almacenes el resultado indefinidamente cuando los dispositivos externos sean importantes. Actualiza la lista antes de abrir un selector o iniciar una operación relevante.

Tampoco supongas que el mismo dispositivo conservará siempre la misma letra. Windows puede asignar otra raíz en una conexión posterior.

Unidades de red

Las unidades de red mapeadas pueden aparecer junto a los discos locales. Pueden requerir credenciales, agregar latencia o quedar temporalmente inaccesibles. El código que inspecciona todas las raíces debe tolerar fallos y permitir excluir destinos lentos.

Las rutas UNC, como \\servidor\recurso, pueden no aparecer si no están mapeadas a una letra. Por tanto, listdrives() no sustituye una configuración explícita de recursos de red conocidos.

Filtrar raíces accesibles

from pathlib import Path
import os

def raices_accesibles():
    resultado = []
    for valor in os.listdrives():
        raiz = Path(valor)
        try:
            next(raiz.iterdir(), None)
        except (OSError, PermissionError):
            continue
        resultado.append(raiz)
    return resultado

Listar una raíz puede ser costoso en algunos dispositivos. Realiza esta comprobación solo cuando sea necesario confirmar acceso real.

Buscar una carpeta conocida

Si conoces la ruta relativa, comprueba directamente el candidato en cada unidad en lugar de recorrer discos completos.

from pathlib import Path
import os

def buscar_en_raices(nombre):
    encontrados = []
    for valor in os.listdrives():
        candidato = Path(valor) / nombre
        try:
            if candidato.exists():
                encontrados.append(candidato)
        except OSError:
            pass
    return encontrados

Para búsquedas amplias, agrega límites de profundidad, filtros, progreso y cancelación.

Validar rutas recibidas del usuario

No confíes en concatenaciones de texto para operaciones destructivas. Resuelve la ruta y confirma que permanece dentro de una raíz autorizada.

from pathlib import Path

def dentro_de_raiz(raiz, relativo):
    base = Path(raiz).resolve()
    destino = (base / relativo).resolve()
    return destino == base or base in destino.parents

Solicita confirmación adicional antes de borrar o sobrescribir datos y evita que un valor vacío apunte accidentalmente a toda la unidad.

Crear un selector de unidad

import os

unidades = os.listdrives()
for indice, unidad in enumerate(unidades, start=1):
    print(f"{indice}. {unidad}")

Valida el índice elegido y actualiza la lista antes de una operación larga, porque los dispositivos subyacentes pueden haber cambiado.

Manejo de errores

Las excepciones habituales son OSError, PermissionError y FileNotFoundError. Registra qué unidad falló y continúa con las demás cuando sea seguro. En interfaces de usuario, explica si el problema se relaciona con permisos, almacenamiento desconectado o ausencia de medio.

Pruebas

Las pruebas no deben depender de las letras reales del equipo. Encapsula la detección en una función e inyecta un proveedor falso.

def elegir_raices(listar):
    return [raiz for raiz in listar() if raiz]

Así puedes probar una lista vacía, una unidad, unidades inaccesibles, duplicados y cambios entre llamadas sin tocar almacenamiento real.

Cuándo no usar os.listdrives

Si el programa ya recibe un directorio configurado, no es necesario examinar todas las unidades. Para carpetas conocidas del usuario, prefiere variables de entorno y APIs de plataforma. En servidores Linux, trabaja con puntos de montaje.

Contenido relacionado

Consulta las guías de Academify sobre el módulo os, pathlib, archivos grandes y manejo de excepciones. Revisa también la documentación oficial de os y la documentación de shutil.

Buenas prácticas

Actualiza la lista antes de trabajos importantes, trata fallos por unidad, evita asumir letras fijas, limita búsquedas y valida rutas externas. En proyectos multiplataforma, aísla el código específico de Windows en una función pequeña y fácil de probar.

Conclusión

os.listdrives() proporciona una forma directa y estándar de descubrir unidades en Windows. Combinada con pathlib, shutil, validación y manejo cuidadoso de excepciones, permite crear selectores de almacenamiento, herramientas de backup y automatizaciones fiables. Trata el resultado como una fotografía temporal: los dispositivos, las redes y los permisos pueden cambiar entre llamadas, por lo que cada acceso importante debe verificarse.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Código binario que representa el protocolo Buffer en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    collections.abc.Buffer: tipa datos binarios

    Aprende collections.abc.Buffer en Python para tipar datos binarios, usar memoryview, reducir copias y manejar memoria con seguridad.

    Ler mais

    Tempo de leitura: 6 minutos
    03/10/2026
    Desarrollador configurando logs estructurados con LoggerAdapter merge_extra en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    LoggerAdapter merge_extra: contexto dinámico en logs

    Aprende LoggerAdapter merge_extra en Python para combinar contexto persistente y campos por llamada en logs estructurados seguros.

    Ler mais

    Tempo de leitura: 5 minutos
    03/10/2026
    Pantalla de portátil con código para análisis TLS usando ssl keylog_filename en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    ssl keylog_filename: analiza TLS en Wireshark

    Aprende ssl keylog_filename en Python para inspeccionar sesiones TLS autorizadas en Wireshark sin desactivar el cifrado.

    Ler mais

    Tempo de leitura: 5 minutos
    02/10/2026
    Portátil con código y base SQLite para sqlite3 autocommit en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    sqlite3 autocommit: controla transacciones en Python

    Aprende sqlite3 autocommit en Python para controlar transacciones, commits, rollbacks, compatibilidad y bloqueos de SQLite.

    Ler mais

    Tempo de leitura: 5 minutos
    02/10/2026
    Programador trabajando con objetos inmutables y copy.replace en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    copy.replace: actualiza objetos inmutables en Python

    Aprende copy.replace en Python para crear nuevas versiones de objetos con cambios puntuales, inmutabilidad y validación segura.

    Ler mais

    Tempo de leitura: 5 minutos
    01/10/2026
    Estructura de archivos y código para pathlib.Path.info en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

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

    Aprende pathlib.Path.info en Python para clasificar archivos con metadatos en caché y optimizar recorridos de directorios.

    Ler mais

    Tempo de leitura: 5 minutos
    01/10/2026