UnicodeDecodeError: corrige codificación en Python

Actualizado el: 20/08/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 com variáveis de ambiente usando python-dotenv
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    Cómo corregir errores de .env en Python con python-dotenv

    Corrige errores de .env con python-dotenv: rutas, find_dotenv, prioridad, booleanos, enteros, variables obligatorias, Git y secretos seguros.

    Ler mais

    Tempo de leitura: 4 minutos
    12/07/2026
    Como resolver loop infinito que nunca termina em Python
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    Bucles infinitos en Python: causas y soluciones

    Identifica y corrige bucles infinitos en Python revisando condiciones, incrementos, continue, entrada, timeouts, límites y depuración con pdb.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Como identificar e corrigir erros de sintaxe em Python
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    SyntaxError: corrige errores de sintaxis en Python

    Corrige SyntaxError en Python revisando tracebacks, dos puntos, delimitadores, comillas, indentación, operadores, f-strings y versiones incompatibles.

    Ler mais

    Tempo de leitura: 6 minutos
    11/07/2026
    Erro Python not recognized no terminal do Windows
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    “Python no se reconoce”: corrige PATH en Windows

    Corrige “Python no se reconoce” en Windows revisando instalación, PATH, Python Launcher, alias de Microsoft Store, VS Code y pip.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Debug de código Python usando o módulo pdb
    Resolución de Errores
    Foto de perfil de Leandro Hirt da Academify

    pdb: depura Python con breakpoints y pila

    Aprende a depurar Python con pdb: breakpoint, next, step, pila de llamadas, condiciones, post mortem, variables y buenas prácticas.

    Ler mais

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

    PermissionError: corrige permisos en Python

    Corrige PermissionError en Python revisando rutas, carpetas protegidas, archivos bloqueados, permisos, servicios y manejo seguro de excepciones.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026