Historia de la pregunta:
La codificación (encoding) y decodificación (decoding) de datos se hicieron relevantes con la necesidad de intercambiar información entre dispositivos, programas y plataformas que pueden interpretar de manera diferente los caracteres y su representación en memoria. En Python, esta tarea se ha vuelto crítica debido a la estricta separación entre cadenas (str) y bytes (bytes), comenzando con Python 3.x, donde las cadenas son secuencias de caracteres Unicode, y los bytes son secuencias de bytes.
Problema:
Al trabajar con archivos, redes y sistemas externos, a menudo hay que convertir datos entre representaciones de bytes y cadenas. El uso incorrecto de las codificaciones puede llevar a errores UnicodeEncodeError y UnicodeDecodeError, comprometiendo la integridad de los datos y causando problemas con el soporte de diferentes idiomas.
Solución:
En Python, para convertir una cadena a bytes se utiliza el método .encode(), y para la conversión inversa — .decode(). La codificación más común es "utf-8":
text = "¡Hola, mundo!" encoded = text.encode('utf-8') # Codificamos la cadena en bytes print(encoded) # b'\xd0\xa1\xd0\xbe...' decoded = encoded.decode('utf-8') # Decodificamos de nuevo a cadena print(decoded) # '¡Hola, mundo!'
Características clave:
open(..., encoding='utf-8')).¿Qué sucede si se intenta decodificar una cadena de bytes con una codificación incorrecta?
Al intentar decodificar bytes utilizando una codificación incorrecta, surgirá un error o se obtendrá una cadena incorrecta. Por ejemplo:
b = b'\xd0\xa1\xd0\xbe\xd0\xb1\xd0\xb0\xd0\xb4\xd1\x83\xd1\x8f' wrong = b.decode('latin-1') print(wrong) # Imprimirá un galimatías, no "¡Hola!"
¿Se puede concatenar una cadena y una cadena de bytes directamente usando +?
No. Esto provocará una excepción TypeError.
s = "abc" b = b"def" # s + b # TypeError: solo se puede concatenar str (no "bytes") con str
¿Se puede escribir un archivo de texto sin especificar explícitamente la codificación?
Sí, pero se considera una mala práctica, ya que se utiliza la codificación del sistema predeterminada, que depende de la configuración del SO, lo que resultará en incompatibilidad entre plataformas.
Un programador escribe un archivo de registro en Windows sin especificar la codificación. El registro se abre en Linux o Mac, pero muestra un galimatías en lugar de caracteres cirílicos.
Ventajas:
Desventajas:
Un programador siempre especifica encoding='utf-8' al trabajar con archivos:
with open('log.txt', 'w', encoding='utf-8') as f: f.write('El programa finalizó con éxito')
Ventajas:
Desventajas: