- Módulos de Serialización
1.1 Conceptos de Serialización y Deserialización
Serialización se refiere al proceso de convertir estructuras de datos de Python, como diccionarios o listas, en cadenas de texto con formato JSON. Esto facilita el almacenamiento o trensmisión de datos.
Deserialización es el proceso inverso, donde se transforman cadenas JSON de vuelta a tipos de datos nativos de Python.
La necesidad de serializar surge porque los archivos de sistema no manejan directamente tipos complejos como diccionarios; por ello, se representan como cadenas para su persistencia.
1.2 Módulo json
El formato JSON es ampliamente usado para el intercambio de datos entre diferentes lenguajes de programación.
Convertir datos de Python a JSON y viceversa
import json
informacion = {'nombre': 'Ana', 'edad': 30, 'profesion': 'Ingeniera', 'pais': 'México'}
# Convertir diccionario a cadena JSON
cadena_json = json.dumps(informacion)
print(cadena_json, type(cadena_json)) # {"nombre": "Ana", "edad": 30, ...} <class 'str'>
# Revertir cadena JSON a diccionario
datos_python = json.loads(cadena_json)
print(datos_python, type(datos_python)) # {'nombre': 'Ana', 'edad': 30, ...} <class 'dict'>
# Codificar a bytes y deserializar
bytes_json = cadena_json.encode('utf-8')
print(bytes_json, type(bytes_json)) # b'{"nombre": "Ana", ...}' <class 'bytes'>
datos_desde_bytes = json.loads(bytes_json)
print(datos_desde_bytes, type(datos_desde_bytes)) # <class 'dict'>
Manejo de archivos con json
import json
registro = {'usuario': 'Carlos', 'activo': True, 'niveles': [1, 2, 3]}
# Escribir en archivo JSON
with open('datos.json', 'w', encoding='utf-8') as archivo_salida:
json.dump(registro, archivo_salida, ensure_ascii=False)
# Leer desde archivo JSON
with open('datos.json', 'r', encoding='utf-8') as archivo_entrada:
contenido = json.load(archivo_entrada)
print(contenido, type(contenido)) # {'usuario': 'Carlos', ...} <class 'dict'>
Al serializar, listas y tuplas de Python se conviertan en arrays JSON, y los booleanos se transforman a minúsculas.
Parámetros del módulo json
import json
ejemplo = {'ciudad': 'Bogotá', 'codigo': 123}
# Con codificación ASCII por defecto
with open('ejemplo.json', 'w', encoding='utf-8') as f:
json.dump(ejemplo, f)
# Salida: {"ciudad": "Bogot\u00e1", "codigo": 123}
# Usar Unicode para caracteres especiales
with open('ejemplo_unicode.json', 'w', encoding='utf-8') as f:
json.dump(ejemplo, f, ensure_ascii=False)
# Salida: {"ciudad": "Bogotá", "codigo": 123}
1.3 Módulo pickle
El módulo pickle permite serializar objetos de Python complejos, como funciones o clases, que json no puede manejar. Utiliza un formato binario.
Serializar funciones con pickle
import pickle
def calcular_suma(a, b):
return a + b
# Convertir función a bytes
bytes_funcion = pickle.dumps(calcular_suma)
print(bytes_funcion, type(bytes_funcion)) # Datos binarios <class 'bytes'>
# Recuperar función desde bytes
funcion_recuperada = pickle.loads(bytes_funcion)
print(funcion_recuperada, type(funcion_recuperada)) # <function calcular_suma at ...> <class 'function'>
Uso de pickle con archivos
import pickle
def mostrar_mensaje(msg):
print(f"Mensaje: {msg}")
# Guardar función en archivo binario
with open('funcion.pkl', 'wb') as archivo_bin:
pickle.dump(mostrar_mensaje, archivo_bin)
# Cargar función desde archivo
with open('funcion.pkl', 'rb') as archivo_bin:
funcion_cargada = pickle.load(archivo_bin)
print(funcion_cargada, type(funcion_cargada))
funcion_cargada("Hola mundo") # Ejecuta la función recuperada
- Módulo os para Interacción con el Sistema Operativo
2.1 Funciones de Ruta con os.path
import os
import datetime
# Ruta absoluta del archivo actual
ruta_absoluta = os.path.abspath(__file__)
print(ruta_absoluta)
# Directorio padre del archivo actual
directorio_padre = os.path.dirname(__file__)
print(directorio_padre)
# Verificar existencia de una ruta
print(os.path.exists('/ruta/inexistente')) # False
# Construir rutas concatenando componentes
nueva_ruta = os.path.join('/home/usuario', 'documentos', 'archivo.txt')
print(nueva_ruta)
# Dividir ruta en directorio y archivo
partes = os.path.split('/home/usuario/doc.txt')
print(partes) # ('/home/usuario', 'doc.txt')
# Obtener el nombre base de la ruta
nombre_base = os.path.basename('/home/usuario/doc.txt')
print(nombre_base) # doc.txt
# Verificar si es archivo o directorio
print(os.path.isfile('/home/usuario/doc.txt')) # True o False
print(os.path.isdir('/home/usuario')) # True o False
# Obtener tiempos de acceso, creación y modificación
tiempo_acceso = os.path.getatime('/home/usuario/doc.txt')
print(datetime.datetime.fromtimestamp(tiempo_acceso))
tiempo_creacion = os.path.getctime('/home/usuario')
print(datetime.datetime.fromtimestamp(tiempo_creacion))
tiempo_modificacion = os.path.getmtime('/home/usuario')
print(datetime.datetime.fromtimestamp(tiempo_modificacion))
# Tamaño en bytes
tamano = os.path.getsize('/home/usuario/doc.txt')
print(tamano)
# Separador de rutas del sistema
print(os.path.sep) # '/' en Linux/Mac, '\' en Windows
2.2 Operaciones con Directorios y Archivos
Crear y eliminar directorios
import os
# Obtener directorio actual de trabajo
directorio_actual = os.getcwd()
print(directorio_actual)
# Crear directorio simple
nuevo_dir = os.path.join(directorio_actual, 'carpeta_nueva')
os.mkdir(nuevo_dir)
print(os.path.exists(nuevo_dir))
# Crear directorios anidados
ruta_anidada = os.path.join(directorio_actual, 'nivel1', 'nivel2')
os.makedirs(ruta_anidada, exist_ok=True) # exist_ok evita errores si existe
# Eliminar directorio vacío
os.rmdir(nuevo_dir)
# Eliminar directorios anidados recursivamente
os.removedirs(ruta_anidada)
Listar y renombrar archivos
import os
# Listar contenido de un directorio
contenido = os.listdir(os.getcwd())
print(contenido)
# Renombrar archivo o directorio
os.rename('nombre_viejo.txt', 'nombre_nuevo.txt')
# Eliminar archivo específico
os.remove('archivo_a_borrar.txt')
Metadatos y comandos del sistema
import os
# Obtener metadatos del archivo actual
metadatos = os.stat(os.path.abspath(__file__))
print(metadatos)
# Cambiar directorio de trabajo
os.chdir('/tmp')
print(os.getcwd())
# Ejecutar comando del sistema y capturar salida
resultado = os.system('ls -la')
print(resultado)
2.3 Suplementos del Módulo os
import os
# Separador de rutas
print(os.sep)
# Terminador de línea del sistema
print(os.linesep) # '\n' en Linux, '\r\n' en Windows
# Identificador del sistema operativo
print(os.name) # 'posix' en Linux, 'nt' en Windows