Cómo corregir UnicodeDecodeError en Python

Publicado el: 11/07/2026
Tempo de leitura: 5 minutos
Como resolver UnicodeDecodeError em arquivos Python

UnicodeDecodeError aparece cuando Python intenta convertir bytes en texto utilizando una codificación que no coincide con el contenido real. El archivo puede estar guardado como Windows-1252, Latin-1, UTF-16 u otro formato, mientras el programa intenta leerlo como UTF-8. El error no significa que el texto esté necesariamente dañado: indica que las reglas elegidas para interpretarlo no funcionan con una secuencia de bytes determinada.

La solución correcta no consiste en ocultar caracteres problemáticos de inmediato, sino en descubrir de dónde provienen los datos y qué codificación utilizan. Esta guía ofrece un proceso seguro para archivos de texto, CSV, respuestas HTTP y datos externos.

Cómo leer el mensaje de error

Un mensaje típico puede verse así:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9
in position 42: invalid continuation byte

El mensaje muestra el codec utilizado, el byte que causó el problema y su posición aproximada. Esa información ayuda a reproducir el fallo con una muestra pequeña.

Especificar encoding al abrir archivos

Evita depender de la codificación predeterminada del sistema. Define siempre el formato esperado:

from pathlib import Path

ruta = Path("clientes.txt")
texto = ruta.read_text(encoding="utf-8")
print(texto)

La guía para leer y escribir archivos de texto en Python explica el uso de with, pathlib y UTF-8. Cuando controlas la creación y lectura del archivo, utiliza UTF-8 en ambos extremos.

Probar una codificación conocida

Muchos archivos antiguos creados en Windows utilizan cp1252. Si conoces el origen, puedes abrirlos explícitamente:

with open("clientes.txt", "r", encoding="cp1252") as archivo:
    contenido = archivo.read()

No cambies a latin-1 únicamente porque “nunca falla”. Esa codificación asigna un carácter a cada byte y puede producir texto aparentemente válido pero incorrecto. La meta es interpretar los datos, no silenciar la excepción.

Detectar BOM y UTF-8 con firma

Algunos programas agregan una marca de orden de bytes al inicio. Para archivos UTF-8 con BOM, utiliza utf-8-sig:

with open("exportacion.csv", encoding="utf-8-sig") as archivo:
    primera_linea = archivo.readline()

El codec elimina la firma al leer y puede agregarla al escribir. Para UTF-16, el BOM también ayuda a identificar el orden de bytes, por lo que encoding="utf-16" suele ser apropiado cuando sabes que ese es el formato.

Inspeccionar bytes antes de decodificar

Cuando el origen es desconocido, abre primero en modo binario:

from pathlib import Path

datos = Path("clientes.txt").read_bytes()
print(datos[:80])

Los bytes no tienen una codificación por sí mismos; la codificación es el acuerdo utilizado para convertirlos en caracteres. Puedes intentar decodificaciones controladas:

for encoding in ["utf-8", "utf-8-sig", "cp1252", "latin-1"]:
    try:
        texto = datos.decode(encoding)
    except UnicodeDecodeError:
        continue
    else:
        print(f"Posible encoding: {encoding}")
        break

Que una decodificación no falle no garantiza que sea correcta. Revisa acentos, símbolos monetarios y caracteres especiales conocidos.

Usar detección automática con cautela

Bibliotecas como charset-normalizer o chardet estiman la codificación a partir de patrones. Son útiles cuando recibes archivos variados, pero el resultado es probabilístico.

from charset_normalizer import from_bytes

datos = Path("clientes.txt").read_bytes()
resultado = from_bytes(datos).best()

if resultado is None:
    raise ValueError("No se pudo estimar la codificación")

texto = str(resultado)
print(resultado.encoding)

Guarda la codificación detectada en registros y establece un umbral o revisión manual para archivos críticos.

Qué hacen errors=’ignore’ y errors=’replace’

Python permite definir una estrategia para bytes inválidos:

texto = datos.decode("utf-8", errors="replace")

replace coloca el carácter de sustitución donde no puede decodificar. ignore elimina los bytes problemáticos. Ambos pueden ser aceptables para previsualizaciones o registros no críticos, pero no para datos legales, financieros o identificadores. Si pierdes caracteres durante la lectura, quizá no puedas reconstruir el valor original.

Procesar CSV con la codificación correcta

El módulo csv recibe un archivo de texto ya decodificado:

import csv

with open("clientes.csv", encoding="cp1252", newline="") as archivo:
    lector = csv.DictReader(archivo)
    for fila in lector:
        print(fila["nombre"])

Para conocer dialectos, encabezados y escritura segura, consulta la guía de archivos CSV en Python. Con Pandas también puedes indicar encoding:

import pandas as pd

df = pd.read_csv("clientes.csv", encoding="cp1252")

Respuestas HTTP y APIs

Una respuesta de red incluye bytes y, con frecuencia, un encabezado Content-Type que declara el charset. La biblioteca Requests intenta inferirlo, pero puedes inspeccionar response.encoding y response.content.

import requests

respuesta = requests.get("https://example.com/datos", timeout=10)
respuesta.raise_for_status()

print(respuesta.encoding)
texto = respuesta.content.decode("utf-8")

La guía de Requests en Python explica timeouts, cabeceras y manejo de errores. Respeta la codificación especificada por el servicio y valida que el cuerpo corresponda al formato esperado.

Convertir un archivo a UTF-8

Después de identificar el encoding original, puedes normalizarlo:

from pathlib import Path

origen = Path("clientes_cp1252.txt")
destino = Path("clientes_utf8.txt")

texto = origen.read_text(encoding="cp1252")
destino.write_text(texto, encoding="utf-8")

No sobrescribas el archivo original hasta verificar la conversión. Conserva una copia y compara una muestra representativa.

Crear una función de lectura con fallback

from pathlib import Path

def leer_texto(ruta: Path, encodings=None) -> tuple[str, str]:
    candidatos = encodings or ["utf-8", "utf-8-sig", "cp1252"]

    for encoding in candidatos:
        try:
            return ruta.read_text(encoding=encoding), encoding
        except UnicodeDecodeError:
            pass

    raise UnicodeError(f"No se pudo decodificar {ruta}")

Este enfoque es apropiado cuando el conjunto de formatos aceptados está definido. Registra qué encoding funcionó para detectar cambios en las fuentes.

Diferencia entre encode y decode

decode convierte bytes en texto; encode convierte texto en bytes.

texto = "Información"
datos = texto.encode("utf-8")
recuperado = datos.decode("utf-8")

Mezclar ambos conceptos genera errores frecuentes. La guía oficial de Unicode de Python explica code points, encodings y normalización. La documentación de open() describe los parámetros encoding, errors y newline.

Buenas prácticas

Define UTF-8 como estándar interno, especifica el encoding al abrir archivos, conserva los bytes originales durante el diagnóstico y evita ignore en datos importantes. Documenta las fuentes externas, añade pruebas con acentos y caracteres no latinos y utiliza pathlib para rutas claras. Ante un fallo genérico, consulta también los errores comunes de Python.

Conclusión

UnicodeDecodeError se resuelve identificando correctamente el contrato entre bytes y texto. Empieza por conocer el origen, abre en binario cuando sea necesario, prueba encodings justificados y verifica el resultado visualmente. Una vez determinada la codificación, normaliza a UTF-8 y registra cualquier excepción. Así evitarás tanto el bloqueo del programa como la corrupción silenciosa de nombres, símbolos y contenidos.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Como resolver erros de codificação UTF-8 em Python
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    Cómo resolver errores de codificación UTF-8 en Python

    Resuelve errores de codificación UTF-8 en Python: encode, decode, archivos, CSV, consola, APIs, normalización y estrategias seguras.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Como resolver erro MemoryError em aplicações Python
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    Cómo corregir MemoryError en Python

    Corrige MemoryError en Python con generadores, lotes, chunks de Pandas, tipos eficientes, tracemalloc y reducción de copias.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Detecção de vazamento de memória em aplicações Python
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    Cómo detectar fugas de memoria en Python

    Aprende a detectar fugas de memoria en Python con tracemalloc, gc, snapshots, cachés, generadores y análisis de referencias.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Uso do cProfile para identificar gargalos em código Python
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    cProfile en Python: encuentra cuellos de botella

    Aprende a usar cProfile en Python para medir funciones, ordenar resultados, analizar pstats y optimizar cuellos de botella con evidencia.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Como resolver RecursionError em Python rapidamente
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    Cómo corregir RecursionError en Python

    Corrige RecursionError en Python revisando casos base, progreso, ciclos, límites, memoización y conversiones de recursión a bucles o pilas.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Como resolver problemas de caminhos de arquivos em scripts Python
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    Cómo corregir FileNotFoundError en Python

    Corrige FileNotFoundError en Python revisando rutas relativas, directorio actual, pathlib, carpetas, Docker, nombres y manejo de excepciones.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026