Módulos y biblioteca estándar de Python
Al finalizar este tema
Comprenderá el funcionamiento de import, podrá utilizar los módulos clave de la biblioteca estándar de Python y podrá instalar y administrar paquetes externos con pip.
¿Qué es un módulo?
Un módulo es un único archivo que contiene código de Python (.py). Es un archivo que contiene funciones, clases y variables, y que puede ser importado y utilizado en otros archivos (import).
# math_utils.pydef add(a, b): return a + b
def multiply(a, b): return a * b
PI = 3.14159# main.pyimport math_utils
print(math_utils.add(3, 5)) # 8print(math_utils.multiply(4, 7)) # 28print(math_utils.PI) # 3.14159Al ejecutar import math_utils, Python busca y ejecuta el archivo math_utils.py en el mismo directorio, lo que permite utilizar sus funciones y variables mediante la sintaxis math_utils.nombre.
Diferentes formas de importar
# 1. Importar el módulo completoimport osos.getcwd() # Directorio actual
# 2. Importar solo una función concretafrom os.path import join, existsjoin("/home", "user") # '/home/user': puede usarse join en vez de os.path.join
# 3. Asignar un aliasimport numpy as npnp.array([1, 2, 3]) # np.array en vez de numpy.array
# 4. Importar todo (no recomendado)from os import * # Riesgo de colisión de nombres; no permite rastrear su origenfrom X import * es práctico, pero su origen es desconocido, por lo que no se recomienda para proyectos grandes. Siempre es mejor usar la importación explícita.
Biblioteca estándar: herramientas disponibles sin instalación
Al instalar Python, se instalan automáticamente cientos de módulos. Esta es la biblioteca estándar. Refleja la filosofía de Python de "incluye todo lo necesario".
os: interacción con el sistema operativo
import os
# Directorio actualprint(os.getcwd()) # /home/user/project
# Lista de archivosfiles = os.listdir(".")print(files) # ['main.py', 'data', 'output']
# Crear un directorioos.makedirs("output/reports", exist_ok=True)
# Variables de entornodb_host = os.environ.get("DB_HOST", "localhost")os.path — Manejo de rutas
import os.path
path = "/home/user/data/report.csv"
os.path.basename(path) # 'report.csv'os.path.dirname(path) # '/home/user/data'os.path.splitext(path) # ('/home/user/data/report', '.csv')os.path.exists(path) # True or Falseos.path.join("data", "output", "file.txt") # 'data/output/file.txt'json — Procesamiento de datos JSON
import json
# Objeto Python → cadena JSONdata = {"name": "Hoon", "scores": [90, 85, 95]}json_str = json.dumps(data, ensure_ascii=False, indent=2)print(json_str)
# Cadena JSON → objeto Pythonparsed = json.loads(json_str)print(parsed["name"]) # Hoon
# Guardar y leer un archivowith open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2)
with open("data.json", "r", encoding="utf-8") as f: loaded = json.load(f)Para que los caracteres no ASCII se guarden sin modificaciones, como en el caso de español, debes incluir ensure_ascii=False.
datetime — Fecha y hora
from datetime import datetime, timedelta
# Hora actualnow = datetime.now()print(now) # 2026-07-03 14:30:00.123456
# Conversión de formatoprint(now.strftime("%Y-%m-%d")) # 2026-07-03print(now.strftime("%Y/%m/%d %H:%M")) # 2026/07/03 14:30
# Cadena → datetimedate = datetime.strptime("2026-07-03", "%Y-%m-%d")
# Cálculos con fechastomorrow = now + timedelta(days=1)week_ago = now - timedelta(weeks=1)diff = datetime(2026, 12, 31) - nowprint(f"D-{diff.days}") # D-181collections — estructuras de datos avanzadas
from collections import Counter, defaultdict
# Counter: contar frecuenciaswords = ["apple", "banana", "apple", "cherry", "banana", "apple"]count = Counter(words)print(count) # Counter({'apple': 3, 'banana': 2, 'cherry': 1})print(count.most_common(2)) # [('apple', 3), ('banana', 2)]
# defaultdict: diccionario con valor predeterminadoscores = defaultdict(list)scores["math"].append(90)scores["math"].append(85)scores["english"].append(92)print(dict(scores)) # {'math': [90, 85], 'english': [92]}random — Generación de números aleatorios
import random
random.randint(1, 100) # Entero entre 1 y 100random.choice(["A", "B", "C"]) # Elige uno de la listarandom.shuffle([1, 2, 3, 4]) # Baraja la lista in siturandom.sample(range(100), 5) # Elige cinco valores únicos entre 0 y 99pip: instalación de paquetes externos
Las funciones que no están incluidas en la biblioteca estándar se instalan mediante paquetes externos.
# Instalaciónpip install requestspip install pandas numpy matplotlib
# Instalar una versión concretapip install requests==2.31.0
# Actualizaciónpip install --upgrade requests
# Desinstalaciónpip uninstall requests
# Lista de paquetes instaladospip list
# Gestionar dependencias con requirements.txtpip freeze > requirements.txt # Registra los paquetes instalados actualmentepip install -r requirements.txt # Instala todos los paquetes registradosrequirements.txt es el archivo que registra los paquetes externos utilizados en el proyecto, lo que permite que otras personas (o servidores) reproduzcan el mismo entorno.
name == "main" — Distinción entre ejecución e importación
# greet.pydef hello(name): print(f"Hello, {name}!")
if __name__ == "__main__": # Solo se ejecuta al ejecutar directamente este archivo hello("World")$ python greet.py # Muestra "Hello, World!"# other.pyimport greet # hello("World") no se ejecutagreet.hello("Python") # Muestra "Hello, Python!"Al ejecutar python greet.py directamente, __name__ se convierte en "__main__". Si se importa desde otro archivo mediante import greet, __name__ se convierte en "greet". Este patrón permite separar el "código de prueba para la ejecución directa" de la "funcionalidad cuando se utiliza como módulo".
Resumen clave
| Concepto | Resumen |
|---|---|
| Módulo | Un archivo .py equivale a un módulo |
import | Importa código de otro archivo |
| Biblioteca estándar | Conjunto de módulos listos para usar sin necesidad de instalación (como os, json, datetime, etc.) |
pip | Herramienta para instalar y gestionar paquetes externos |
requirements.txt | Registro de las dependencias del proyecto |
__name__ | Distinción entre ejecución directa e importación |
Una de las ventajas de Python es su amplia biblioteca estándar y su extenso ecosistema de terceros (más de 500.000 paquetes en PyPI). Siguiendo el principio de "no reinventar la rueda", es recomendable consultar primero la biblioteca estándar y PyPI antes de implementar una solución directamente, lo que aumenta la productividad.
Patrón práctico: combinar varios módulos
En la práctica, rara vez se utiliza un solo módulo. Lo habitual es combinar varias bibliotecas estándar.
import osimport jsonfrom datetime import datetime
def process_data_files(directory): results = [] for filename in os.listdir(directory): if not filename.endswith(".json"): continue filepath = os.path.join(directory, filename) with open(filepath, "r", encoding="utf-8") as f: data = json.load(f) results.append({ "file": filename, "records": len(data), "processed_at": datetime.now().strftime("%Y-%m-%d %H:%M") }) return results
# output:# [# {"file": "users.json", "records": 150, "processed_at": "2026-07-03 14:30"},# {"file": "orders.json", "records": 423, "processed_at": "2026-07-03 14:30"}# ]Explore el archivo con os, léalo con json y registre el tiempo con datetime: estos tres módulos se integran de forma fluida. Este patrón es fundamental para la creación de scripts.