Lingua-e
← Errores
Python

Qué significa UnicodeDecodeError y cómo solucionarlo

Referencia del error

UnicodeDecodeError

Lenguaje

Python

Severidad

Media

Cuándo ocurre

Un UnicodeDecodeError se lanza cuando Python intenta decodificar una secuencia de bytes en un string usando una codificación determinada (como UTF-8) pero encuentra bytes que no son válidos para esa codificación.

Posibles soluciones

Especifica siempre la codificación explícitamente al abrir archivos: open('archivo.txt', encoding='utf-8'). Si la codificación es desconocida, usa la librería chardet para detectarla. Pasa errors='replace' o errors='ignore' como último recurso cuando la pérdida de datos es aceptable.

Errores relacionados

Más detalles

Un UnicodeDecodeError se lanza cuando Python intenta decodificar una secuencia de bytes en un string usando una codificación determinada (como UTF-8) pero encuentra bytes que no son válidos para esa codificación. Es común al leer archivos guardados con un conjunto de caracteres diferente.

Por qué ocurre

  • Abrir un archivo guardado con codificación Latin-1 o Windows-1252 cuando Python usa UTF-8 por defecto.
  • Leer un archivo binario (imagen, PDF, ejecutable) como si fuera texto plano.
  • Un archivo que mezcla codificaciones, por ejemplo un archivo UTF-8 con algunos caracteres codificados en un sistema legado.
  • Datos de red o contenido de base de datos que contienen bytes fuera del rango ASCII.

Posibles soluciones

Especifica siempre la codificación explícitamente al abrir archivos: open('archivo.txt', encoding='utf-8'). Si la codificación es desconocida, usa la librería chardet para detectarla. Pasa errors='replace' o errors='ignore' como último recurso cuando la pérdida de datos es aceptable.

Ejemplos

Python

Código que causa el error

with open("report.csv") as f:
    content = f.read()

Error en la terminal

Traceback (most recent call last):
  File "app.py", line 2, in <module>
    content = f.read()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 42: invalid continuation byte

Código corregido

# Specify the correct encoding, or use errors='replace' as a fallback
with open("report.csv", encoding="latin-1") as f:
    content = f.read()

# If encoding is unknown, detect it first:
# pip install chardet
import chardet
raw = open("report.csv", "rb").read()
detected = chardet.detect(raw)
print(detected["encoding"])  # e.g. 'ISO-8859-1'

Practica en inglés

¿Cómo le explicarías un UnicodeDecodeError a un compañero dev? Elige la frase correcta:

"I hit an error...

¿Listo para practicar tu inglés en el trabajo?

Lingua-e tiene ejercicios interactivos basados en conversaciones reales de developers: standups, code reviews, retrospectivas y más. Practica hasta que salga solo.

Prueba Lingua-e gratis