Qué significa UnicodeDecodeError y cómo solucionarlo
Referencia del error
UnicodeDecodeError
Lenguaje
Severidad
MediaCuá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
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 byteCó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