"For line in ..." da como resultado UnicodeDecodeError: el códec 'utf-8' no puede decodificar el byte


214

Aquí está mi código

for line in open('u.item'):
#read each line

cada vez que ejecuto este código me da el siguiente error:

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

Intenté resolver esto y agregar un parámetro adicional en open (), el código se ve así;

for line in open('u.item', encoding='utf-8'):
#read each line

Pero nuevamente da el mismo error. ¡que debería hacer entonces! Por favor ayuda.


3
Datos mal codificados, supongo.
— Andreas Jung el

99
O simplemente no datos UTF-8.
— Mark Tolonen


Tuvimos este error con msgpack cuando usamos python 3 en lugar de python 2.7. Para nosotros, el curso de acción fue trabajar con Python 2.7.
— Jesse W. Collins

Respuestas:


402

Como sugirió Mark Ransom, encontré la codificación correcta para ese problema. La codificación era "ISO-8859-1", por lo que reemplazar open("u.item", encoding="utf-8")con open('u.item', encoding = "ISO-8859-1")va a resolver el problema.


8
Explícito es mejor que implícito (PEP 20).
— Ioannis Filippidis

66
El truco es que ISO-8859-1 o Latin_1 son juegos de caracteres de 8 bits, por lo que toda la basura tiene un valor válido. Quizás no sea utilizable, ¡pero si quieres ignorarlo!
— Kjeld Flarup

1
Tuve el mismo problema UnicodeDecodeError: el códec 'utf-8' no puede decodificar el byte 0xd0 en la posición 32: byte de continuación no válido. Usé Python 3.6.5 para instalar aws cli. Y cuando probé aws --version falló con este error. Así que tuve que editar /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py y cambié el código a la siguiente lectura def (self, nombres de archivo, codificación = "ISO-8859-1" ):
— Евгений Коптюбенко

3
¿Existe una forma automática de detectar la codificación?
— OrangeSherbet

55
@OrangeSherbet Implementé la detección usando chardet. Aquí está la de una sola línea (después import chardet): chardet.detect(open(in_file, 'rb').read())['encoding']. Mira esta respuesta para más detalles: stackoverflow.com/a/3323810/615422
— VertigoRay

51

También funcionó para mí, ISO 8859-1 va a ahorrar mucho, jajaja, principalmente si se usan las API de reconocimiento de voz

Ejemplo:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

44
Puede tener razón en que el OP está leyendo ISO 8859-1, como se puede deducir del 0xe9 (é) en el mensaje de error, pero debe explicar por qué funciona su solución. La referencia a las API de reconocimiento de voz no ayuda.
— RolfBly

55
¿Qué pasa con el punto y coma?
— Pierna derecha el

29

Su archivo en realidad no contiene datos codificados utf-8, contiene alguna otra codificación. Averigua cuál es esa codificación y úsala en la openllamada.

En Windows-1252, por ejemplo, la codificación 0xe9sería el carácter é.


44
Entonces, ¿cómo puedo averiguar qué codificación es? Estoy usando Linux
— SujitS

44
No hay forma de hacer eso que siempre funciona, pero vea la respuesta a esta pregunta: stackoverflow.com/questions/436220/…
— RemcoGerlich

20

Prueba esto para leer usando pandas

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')

No estoy seguro de por qué estás sugiriendo pandas. La solución es configurar la codificación correcta, que has encontrado aquí.
— Alastair McCormack

12

Si está utilizando Python 2lo siguiente será la solución:

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

Como el encodingparámetro no funciona open(), recibirá el siguiente error:

TypeError: 'codificación' es un argumento de palabra clave no válido para esta función

1
Pero esta es la versión 3
— SujitS

1
Si lo se. Pensé que podría ser útil para las personas que usanPython 2
— Jeril

Trabajado para mí en python3 así
— fenkerbb

2
En caso de que quieras algo más fácil de recordar, 'ISO-8859-1'también se conoce como 'latin-1'o 'latin1'.
— Max Candocia el

9

Podrías resolver el problema con:

for line in open(your_file_path, 'rb'):

'rb' está leyendo el archivo en modo binario. Lee más aquí . Espero que esto ayude!


6

Esto funciona:

open('filename', encoding='latin-1')

o:

open('filename',encoding="IS0-8859-1")

2

Si alguien busca estos, este es un ejemplo para convertir un archivo CSV en Python 3:

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

A veces, cuando open(filepath)en filepathrealidad no hay un archivo, se obtiene el mismo error, así que primero asegúrate de que el archivo que intentas abrir existe:

import os
assert os.path.isfile(filepath)

Espero que esto ayude.


1

puedes intentarlo de esta manera:

open('u.item', encoding='utf8', errors='ignore')

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación. - De la opinión
— MartenCatcher
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.