Saltar al contenido
🐍 Curso de Python
/

Módulo 1 · Lección 42 de 59

La biblioteca estándar

Recorrido práctico por los módulos que ya vienen instalados con Python y que te ahorran escribir código desde cero.

⏱ 14 min de lectura

Cuando instalaste Python no instalaste solo el intérprete. Con él vinieron unos doscientos módulos listos para usar: para trabajar con fechas, generar números al azar, medir tiempos, leer ficheros comprimidos, hablar por red o calcular medias. Esa colección se llama la biblioteca estándar, y de ahí viene la frase con la que se describe a Python desde los años noventa: batteries included, con las pilas puestas.

Esto importa más de lo que parece. Antes de escribir una función para calcular los días que hay entre dos fechas, o para barajar una lista, para en seco y comprueba si ya existe. Casi siempre existe, está mejor probada que la tuya y no tienes que mantenerla.

Fechas y horas con datetime#

El módulo datetime es el que más vas a usar de los que vienen aquí. Tiene dos piezas principales: date, que guarda solo día, mes y año, y datetime, que además lleva la hora.

python
from datetime import date

hoy = date.today()
print(hoy)
print(f"Día {hoy.day}, mes {hoy.month}, año {hoy.year}")
Salida en pantalla
2026-09-19
Día 19, mes 9, año 2026

Dar formato con strftime#

Por defecto una fecha se imprime en formato internacional, año-mes-día. Para mostrarla como se escribe en España tienes strftime(), que recibe una plantilla con códigos que empiezan por %:

python
from datetime import datetime

ahora = datetime.now()

print(ahora.strftime("%d/%m/%Y"))
print(ahora.strftime("%H:%M"))
print(ahora.strftime("%d/%m/%Y a las %H:%M"))
Salida en pantalla
19/09/2026
13:38
19/09/2026 a las 13:38

Los códigos que necesitarás casi siempre son estos:

CódigoSignificadoEjemplo
%dDía con dos cifras07
%mMes con dos cifras03
%YAño con cuatro cifras2026
%yAño con dos cifras26
%HHora de 0 a 2314
%MMinutos05
%SSegundos42
%ANombre del díaMonday
%BNombre del mesMarch

Restar fechas#

Restar dos fechas no da un número, da una duración: un timedelta. De ahí sacas los días con .days.

python
from datetime import date, timedelta

inicio_curso = date(2026, 1, 15)
fin_curso = date(2026, 6, 30)

duracion = fin_curso - inicio_curso
print(duracion)
print(duracion.days)

entrega = inicio_curso + timedelta(days=45)
print(entrega)
print(entrega.strftime("%d/%m/%Y"))
Salida en pantalla
166 days, 0:00:00
166
2026-03-01
01/03/2026

Fíjate en la segunda parte: sumar un timedelta a una fecha te da otra fecha, y Python se encarga solo de los meses de distinta longitud y de los años bisiestos. Calcular "45 días después del 15 de enero" a mano sería un pequeño infierno.

python
from datetime import date

nacimiento = date(1995, 7, 23)
hoy = date(2026, 3, 1)

dias_vividos = (hoy - nacimiento).days
print(f"Has vivido {dias_vividos} días, unos {dias_vividos // 365} años")
Salida en pantalla
Has vivido 11179 días, unos 30 años

Azar con random#

random genera números y elecciones al azar. Es el módulo de los juegos, los sorteos y los datos de prueba.

python
import random

print(random.randint(1, 6))

colores = ["rojo", "verde", "azul", "amarillo"]
print(random.choice(colores))

baraja = ["as", "dos", "tres", "cuatro", "cinco"]
random.shuffle(baraja)
print(baraja)

print(random.sample(range(1, 50), 6))
print(random.random())
Salida en pantalla
1
rojo
['dos', 'cuatro', 'tres', 'as', 'cinco']
[42, 40, 29, 37, 4, 11]
0.899376415846804

Esta salida es la de una ejecución concreta: la tuya será distinta, y la siguiente vez también. Las cuatro funciones que más se usan son:

  • randint(a, b) devuelve un entero entre a y b, incluidos los dos extremos. Ojo con esto, porque range() funciona al revés y deja fuera el final.
  • choice(secuencia) elige un elemento al azar de una lista, una tupla o una cadena.
  • shuffle(lista) baraja la lista en el sitio: modifica la original y devuelve None. Si escribes baraja = random.shuffle(baraja) te quedas sin lista.
  • sample(poblacion, k) saca k elementos distintos sin repetir, que es justo lo que necesita un sorteo o una lotería.

Tiempos con time#

time hace dos cosas que necesitarás pronto: pausar el programa y medir cuánto tarda algo.

python
import time

print("Preparando el envío...")
time.sleep(2)
print("Enviado")

inicio = time.perf_counter()
total = 0
for numero in range(1_000_000):
        total += numero * numero
fin = time.perf_counter()

print(f"El cálculo ha tardado {fin - inicio:.3f} segundos")
Salida en pantalla
Preparando el envío...
Enviado
El cálculo ha tardado 0.121 segundos

sleep() recibe segundos y admite decimales: time.sleep(0.5) espera medio segundo. perf_counter() devuelve un número de segundos que por sí solo no significa nada; lo único útil es la diferencia entre dos llamadas. El tiempo que te salga a ti dependerá de tu ordenador.

Estadística con statistics#

Calcular una media a mano es fácil, pero la mediana ya obliga a ordenar y a distinguir entre longitud par e impar. El módulo statistics lo tiene resuelto:

python
import statistics

notas = [4.5, 7.0, 8.25, 6.0, 9.5, 5.5, 7.0]

print(statistics.mean(notas))
print(statistics.median(notas))
print(statistics.mode(notas))
print(round(statistics.stdev(notas), 2))
Salida en pantalla
6.821428571428571
7.0
7.0
1.69

mean() es la media aritmética, median() el valor central una vez ordenados, mode() el que más se repite y stdev() la desviación típica. Para mostrar una media por pantalla, redondéala con una f-string: f"{statistics.mean(notas):.2f}".

Contar cosas con Counter#

Contar cuántas veces aparece cada elemento de una lista es tan habitual que tiene su propia herramienta dentro del módulo collections. Se llama Counter y funciona como un diccionario que se rellena solo:

python
from collections import Counter

votos = ["python", "java", "python", "rust", "python", "java", "go"]
recuento = Counter(votos)

print(recuento)
print(recuento["python"])
print(recuento["cobol"])
print(recuento.most_common(2))
Salida en pantalla
Counter({'python': 3, 'java': 2, 'rust': 1, 'go': 1})
3
0
[('python', 3), ('java', 2)]

Dos detalles que lo hacen cómodo: preguntar por una clave que no existe devuelve 0 en vez de dar KeyError, y most_common(n) te entrega los n más frecuentes ya ordenados de mayor a menor, en una lista de tuplas que puedes desempaquetar en un for.

python
from collections import Counter

frase = "programar es repetir hasta que salga"
letras = Counter(frase.replace(" ", ""))
print(letras.most_common(3))
Salida en pantalla
[('a', 6), ('r', 5), ('e', 4)]

os y sys, el sistema por debajo#

Estos dos módulos son la puerta hacia el sistema operativo y hacia el propio intérprete. Por ahora te basta con saber que existen y con cuatro cosas de cada uno.

os habla con el sistema: carpeta actual, variables de entorno, nombre de la plataforma.

python
import os

print(os.getcwd())
print(os.name)
print(os.environ.get("EDITOR", "no definido"))
Salida en pantalla
/Users/erwin/curso-python
posix
no definido

os.name vale posix en macOS y Linux, y nt en Windows. os.environ es un diccionario con las variables de entorno, y como es un diccionario tiene get() con valor por defecto.

sys habla del programa en ejecución: los argumentos con los que se ha lanzado y la versión del intérprete.

argumentos.py
import sys

print(sys.platform)
print(sys.argv)

Ejecutado desde la terminal con dos palabras detrás:

bash
python3 argumentos.py informe.csv --detallado
Salida en pantalla
darwin
['argumentos.py', 'informe.csv', '--detallado']

sys.argv es una lista donde el primer elemento es siempre el nombre del propio fichero, y a partir del segundo vienen los argumentos que escribió quien lo ejecuta. Es la base de los programas de terminal, y tiene módulo propio más adelante en el curso.

Tabla de referencia#

MóduloPara qué sirveEjemplo
datetimeFechas, horas y cálculos entre ellasdate.today().strftime("%d/%m/%Y")
randomNúmeros y elecciones al azarrandom.randint(1, 6)
secretsAzar seguro para contraseñas y clavessecrets.randbelow(100)
timePausas y medición de tiempostime.sleep(1.5)
statisticsMedia, mediana, moda, desviaciónstatistics.mean(notas)
collectionsEstructuras extra, como CounterCounter(palabras).most_common(3)
mathRaíces, potencias, redondeos, pimath.sqrt(144)
osCarpetas, entorno, sistema operativoos.getcwd()
sysArgumentos y datos del intérpretesys.argv
pathlibRutas de ficheros y carpetasPath("datos") / "notas.txt"
jsonLeer y escribir JSONjson.dumps(configuracion)
csvLeer y escribir ficheros de hoja de cálculocsv.DictReader(fichero)