Aprende leyendo en orden

pickle y base64 — Serialización de objetos y conversión binario-texto

Serializa dict y clases propias a bytes con pickle.dumps / loads y restáuralas íntegras, y transporta binario por canales de texto con base64.b64encode / b64decode observando los tipos.

Cubriremos dos módulos usados al mover datos a través de archivos o por la red. pickle guarda objetos Python (dicts, instancias de clases, etc.) en una forma que se puede restaurar completamente más tarde, mientras que base64 convierte datos binarios como imágenes o audio en una cadena de "alfanuméricos más dos símbolos" para que puedas insertarlos directamente en email, JSON o URLs. Ambos son módulos de la biblioteca estándar para conversión de datos en límites internos o transportes externos.

Aclarando para qué sirve cada módulo

Los dos módulos se separan naturalmente por combinación de entrada/salida. Usa el diagrama de abajo para captar la idea general; luego profundizaremos en usos típicos y APIs en cada sección.

Roles de los dos módulos
pickleobjeto ↔ bytesinterno / entre procesosbase64binario ↔ ASCIItransporte (JSON/email)
pickle hace objeto ↔ bytes (almacenamiento interno, entre procesos); base64 hace binario ↔ texto ASCII (conversión de transporte: JSON / email / URLs). Sus casos de uso no se solapan, así que a veces los combinarás.

pickle — Convertir objetos Python directamente a bytes

pickle es un módulo de la biblioteca estándar que convierte objetos Python en una forma que se puede restaurar completamente más tarde. El resultado es un valor bytes (una secuencia contigua de enteros de 0 a 255 — un tipo para manejar "secuencias de números" en lugar de "secuencias de caracteres" como las cadenas). Bytes es el formato básico para situaciones donde las máquinas, no los humanos, leerán los datos — guardar a archivos, enviar por la red, entregar datos a otro proceso.

Cuatro usos típicos de pickle
guardar modelo MLarchivos model.pkltransferencia entre procesosmultiprocessingcaché de cómputosaltar trabajo pesadocola de tareasCelery mueve args
Guardar modelos ML / transferir objetos entre procesos / cachear cómputos costosos / colas de tareas. Lo común es que todos se quedan dentro del mundo Python — para hablar con el exterior, usa json.

A diferencia de json, la fortaleza de pickle es poder guardar no solo dicts / lists / cadenas / números, sino también instancias de clases personalizadas y objetos función, lo que lo hace útil para guardar modelos ML o pasar objetos entre procesos Python.

Simetría de pickle.dumps / loads
objeto Python(dict / instancia / etc.)pickle.dumpsbytes(forma binaria)bytes(forma binaria)pickle.loadsobjeto Python(dict / instancia / etc.)escribirleer
Fila superior: dumps = la dirección objeto Python → bytes. Fila inferior: loads = la dirección bytes → objeto Python. A diferencia de json, las instancias de clases personalizadas se preservan tal cual, pero el valor de retorno son bytes, no texto (así que al escribir a un archivo, abre en modo binario "wb" / "rb").

Nunca hagas loads de pickle de otra persona

pickle.loads puede ejecutar código Python arbitrario, así que pasarle bytes de una fuente no confiable se convierte en una vulnerabilidad de ejecución de código arbitrario. Limítate a escenarios de "yo lo creé, yo lo leo de vuelta" y nunca lo uses en datos recibidos por la red o de otra persona. Para comunicación externa, usa json en su lugar.

FunciónFunciónNotas
pickle.dumps(obj)objeto Python → bytesdevuelve bytes (no str)
pickle.loads(b)bytes → objeto Pythonsolo fuentes confiables
pickle.dump(obj, file)escribir a un archivoabrir en modo binario open(..., "wb")
pickle.load(file)leer desde un archivoabrir en modo binario open(..., "rb")

Convierte un diccionario de puntuaciones a bytes con pickle y comprueba el tipo de retorno. Los bytes de pickle pueden variar en longitud entre entornos, así que lo verificaremos vía type.

① Importa el módulo pickle.

② Define el diccionario {"name": "Ana", "scores": [80, 90, 75]} en una variable llamada data.

③ Convierte data a bytes con pickle, guárdalo en pickled e imprime el nombre del tipo como Tipo: ◯◯ (debería ser bytes).

(Si lo ejecutas correctamente, aparecerá una explicación.)

Editor Python

Ejecutar el código para ver el resultado

Restaura el pickled que creaste en la Práctica 1 a un objeto Python y verifica que coincida exactamente con el data original. Las variables data y pickled de la Práctica 1 siguen disponibles, así que solo necesitas escribir el paso de restauración.

④ Restaura pickled con pickle.loads en una variable llamada restored.

⑤ Imprime Nombre restaurado: ◯◯ (el campo name del objeto restaurado) y Igual al original: True / False para la comprobación de igualdad.

Editor Python

Ejecutar el código para ver el resultado

base64 — Mover datos binarios a través de texto

base64 es un módulo que convierte datos binarios arbitrarios en una cadena de "alfanuméricos más dos símbolos". Como 3 bytes se convierten en 4 caracteres, el tamaño crece aproximadamente 1.33×, pero se usa ampliamente en situaciones donde necesitas transportar datos binarios por canales solo de texto, como adjuntos de email, incrustar imágenes en JSON o URLs, o almacenar bytes en SQL.

Las dos APIs básicas:

FunciónEntradaDevuelve
base64.b64encode(bytes)bytes (los datos fuente)bytes codificados en Base64
base64.b64decode(Base64)bytes / str (forma Base64)los bytes originales
Cuatro usos típicos de base64
imagen en JSON / HTMLdata:image/png;base64,…adjuntos de emailmecanismo MIMEtokens JWT(autenticación web)codificación de payloadcertificados en env varsdatos multilínea en una línea
Incrustar imágenes en JSON / HTML (data URLs) / adjuntos de email (MIME) / payloads de tokens JWT (JSON Web Token — un token de autenticación web que lleva info del usuario con detección de manipulación) / meter certificados en variables de entorno o archivos de configuración. Lo común es mover binario a través de canales solo de texto.
Cómo funciona base64
datos binariosb"Python is fun!"b64encodecadena Base64UHl0aG9uIGlzIGZ1biE=cadena Base64UHl0aG9uIGlzIGZ1biE=b64decodedatos binariosb"Python is fun!"encodedecode
Fila superior: encode = la dirección datos binarios → cadena Base64. Fila inferior: decode = la dirección cadena Base64 → datos binarios originales. Internamente, 3 bytes se dividen en cuatro trozos de 6 bits mapeados a A–Z / a–z / 0–9 / + / / (64 caracteres); el conteo de caracteres crece a 4/3 del original, con relleno = para cualquier déficit.
import base64

# bytes → Base64
binary = b"Python is fun!"
encoded = base64.b64encode(binary)
print(encoded)              # b'UHl0aG9uIGlzIGZ1biE='
print(encoded.decode())     # UHl0aG9uIGlzIGZ1biE= (convertido a str)

# Base64 → bytes
decoded = base64.b64decode(encoded)
print(decoded)              # b'Python is fun!'
print(decoded == binary)    # True

Para URLs, usa urlsafe_b64

El b64encode estándar incluye + y /, así que incrustarlo directamente en URLs o claves JSON requiere escaparlo. Para URLs y JSON, elige base64.urlsafe_b64encode en su lugar — cambia +- y /_ para darte una variante URL-safe. Usa base64.urlsafe_b64decode para restaurar.

Codifica una cadena de bytes con Base64, decodifícala de nuevo y verifica que el resultado coincida con el original.

① Importa el módulo base64.

② Define la cadena de bytes b"Python is fun!".

③ No imprimas los bytes codificados en Base64 como bytes — conviértelos primero a una cadena ASCII e imprímelos como Cadena Base64: ◯◯.

④ Decodifica el Base64 de vuelta al binario original e imprime si coincide con el original como Igual al original: True / False.

Editor Python

Ejecutar el código para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Cuál es el peligro de llamar a pickle.loads con datos pickle no confiables?

Pregunta 2¿Cuál es el tipo del valor de retorno de pickle.dumps(obj)?

Pregunta 3¿Qué función es la mejor cuando quieres poner una cadena base64 en un parámetro de URL?