Python UnicodeDecodeError: el códec ASCII no puede decodificar el byte en la posición: ordinal fuera del rango

Abid Ullah 21 junio 2023
  1. Error de decodificación Unicode en Python
  2. Cómo resolver el error de decodificación Unicode en Python
Python UnicodeDecodeError: el códec ASCII no puede decodificar el byte en la posición: ordinal fuera del rango

En este artículo aprenderemos a resolver el UnicodeDecodeError que se produce durante la ejecución del código. Veremos las diferentes razones que causan este error.

También encontraremos formas de resolver este error en Python. Comencemos con lo que es el UnicodeDecodeError en Python.

Error de decodificación Unicode en Python

Si se enfrenta a un UnicodeDecodeError recurrente y no está seguro de por qué sucede o cómo resolverlo, este es el artículo para usted.

En este artículo, profundizamos sobre por qué aparece este error y un enfoque simple para resolverlo.

Causas del error de decodificación Unicode en Python

En Python, el UnicodeDecodeError aparece cuando usamos un tipo de códec para intentar decodificar bytes que ni siquiera fueron codificados con este códec. Para ser más específicos, comprendamos este problema con la ayuda de una analogía de cerradura y llave.

Supongamos que creamos un candado que solo se puede abrir con una llave única hecha específicamente para ese candado.

¿Qué sucede cuando intentas abrir esta cerradura con una llave que no fue hecha para esta cerradura? No encajaría.

Vamos a crear el archivo ejemplo.txt con los siguientes contenidos.

𝘈Ḇ𝖢𝕯٤ḞԍНǏ
hello world

Intentemos decodificar este archivo usando el códec ascii usando el siguiente código.

Ejemplo 1:

with open("example.txt", "r", encoding="ascii") as f:
    lines = f.readlines()
    print(lines)

La salida del código:

Traceback (most recent call last):
  File "/home/fatina/PycharmProjects/examples/main.py", line 2, in <module>
    lines = f.readlines()
  File "/usr/lib/python3.10/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)

Veamos otro ejemplo más sencillo de lo que sucede cuando codificas una cadena con un códec y la decodificas con otro diferente.

Ejemplo 2:

string = "𝘈Ḇ𝖢𝕯٤ḞԍНǏ"
encoded_string = string.encode("utf-8")
decoded_string = encoded_string.decode("ascii")
print(decoded_string)

En este ejemplo, tenemos una cadena codificada con el códec utf-8, y en la siguiente línea, intentamos decodificar esta cadena con el códec ascii.

La salida del código:

Traceback (most recent call last):
  File "/home/fatina/PycharmProjects/examples/main.py", line 4, in <module>
    decoded_string = encoded_string.decode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)

Esto sucede porque el contenido del archivo en el ejemplo 1 y la cadena en el ejemplo 2 no fueron codificados usando el códec ascii, pero intentamos decodificar estos scripts usándolo. Esto da como resultado el UnicodeDecodeError.

Cómo resolver el error de decodificación Unicode en Python

Resolver este problema es bastante sencillo. Si exploramos la documentación de Python, veremos varios códecs estándar disponibles para ayudarlo a decodificar bytes.

Entonces, si tuviéramos que reemplazar ascii con el códec utf-8 en los códigos de ejemplo anteriores, habría decodificado con éxito los bytes en example.txt.

Código de ejemplo:

with open("example.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    print(lines)

La salida del código:

['𝘈Ḇ𝖢𝕯٤ḞԍНǏ\n', 'hello world']

En cuanto al segundo ejemplo, solo necesita hacer lo mismo.

Código de ejemplo:

string = "𝘈Ḇ𝖢𝕯٤ḞԍНǏ"
encoded_string = string.encode("utf-8")
decoded_string = encoded_string.decode("utf-8")
print(decoded_string)

La salida del código:

𝘈Ḇ𝖢𝕯٤ḞԍНǏ

Es importante mencionar que, a veces, es posible que una cadena no se decodifique por completo con un códec.

Entonces, si surge la necesidad, puede desarrollar su programa para ignorar cualquier carácter que no pueda decodificar simplemente agregando el argumento ignorar como este:

with open("example.txt", "r", encoding="utf-8", errors="ignore") as f:
    lines = f.readlines()
    print(lines)

Si bien esto omitirá cualquier error que encuentre el compilador al decodificar algunos caracteres, es importante mencionar que esto puede provocar la pérdida de datos.

Esperamos que este artículo le resulte útil para comprender cómo resolver el UnicodeDecodeError en Python.

Autor: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn

Artículo relacionado - Python Error