"For line in ..." genera UnicodeDecodeError: il codec 'utf-8' non può decodificare byte


215

Ecco il mio codice,

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

ogni volta che eseguo questo codice dà il seguente errore:

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

Ho provato a risolvere questo problema e ho aggiunto un parametro aggiuntivo in open (), il codice è simile;

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

Ma di nuovo dà lo stesso errore. cosa dovrei fare allora! Per favore aiuto.


3
Presumo dati codificati male.
Andreas Jung,

9
O semplicemente non i dati UTF-8.
Mark Tolonen,


Abbiamo riscontrato questo errore con msgpack quando si utilizzava Python 3 invece di Python 2.7. Per noi, il corso dell'azione era lavorare con Python 2.7.
Jesse W. Collins,

Risposte:


405

Come suggerito da Mark Ransom, ho trovato la codifica giusta per quel problema. La codifica era "ISO-8859-1", quindi la sostituzione open("u.item", encoding="utf-8")con open('u.item', encoding = "ISO-8859-1")risolverà il problema.


8
Esplicito è meglio che implicito (PEP 20).
Ioannis Filippidis,

6
Il trucco è che ISO-8859-1 o Latin_1 sono set di caratteri a 8 bit, quindi tutta la spazzatura ha un valore valido. Forse non utilizzabile, ma se vuoi ignorarlo!
Kjeld Flarup,

1
Ho avuto lo stesso problema UnicodeDecodeError: il codec 'utf-8' non può decodificare il byte 0xd0 in posizione 32: byte di continuazione non valido. Ho usato Python 3.6.5 per installare aws cli. E quando ho provato aws - versione non è riuscita con questo errore. Quindi ho dovuto modificare /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py e ho cambiato il codice con il seguente def read (self, nomi di file, codifica = "ISO-8859-1" ):
Евгений Коптюбенко,

3
Esiste un modo automatico per rilevare la codifica?
OrangeSherbet,

5
@OrangeSherbet Ho implementato il rilevamento utilizzando chardet. Ecco l'one-liner (dopo import chardet): chardet.detect(open(in_file, 'rb').read())['encoding']. Check out questa risposta per i dettagli: stackoverflow.com/a/3323810/615422
VertigoRay

51

Anche per me ha funzionato, ISO 8859-1 risparmierà molto, ahahah, soprattutto se si utilizzano le API di riconoscimento vocale

Esempio:

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

4
Potresti aver ragione sul fatto che l'OP sta leggendo ISO 8859-1, come si può dedurre dallo 0xe9 (é) nel messaggio di errore, ma dovresti spiegare perché la tua soluzione funziona. Il riferimento alle API di riconoscimento vocale non aiuta.
RolfBly,

5
Cos'è il punto e virgola?
Gamba destra,

29

Il tuo file in realtà non contiene dati codificati utf-8, contiene qualche altra codifica. Scopri cos'è quella codifica e usala nella openchiamata.

Nella codifica Windows-1252, ad esempio, 0xe9sarebbe il personaggio é.


4
Quindi, come posso scoprire che codifica è! Sto usando Linux
SujitS il

4
Non c'è modo di farlo che funziona sempre, ma vedere la risposta a questa domanda: stackoverflow.com/questions/436220/...
RemcoGerlich

20

Prova questo per leggere usando i panda

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

Non sono sicuro del motivo per cui stai suggerendo Panda. La soluzione sta impostando la codifica corretta, che hai modificato qui.
Alastair McCormack,

12

Se si utilizza Python 2la soluzione seguente sarà:

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

Perché il encodingparametro non funzionaopen() , verrà visualizzato il seguente errore:

TypeError: 'encoding' è un argomento di parole chiave non valido per questa funzione

1
Ma questa è la versione 3
SujitS

1
Si lo so. Ho pensato che potesse essere utile per le persone che usanoPython 2
Jeril

Ha funzionato anche per me in Python3
fenkerbb,

2
Nel caso in cui desideri qualcosa di più facile da ricordare, 'ISO-8859-1'è anche noto come 'latin-1'o 'latin1'.
Max Candocia,

10

È possibile risolvere il problema con:

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

'rb' sta leggendo il file in modalità binaria. Leggi di più qui . Spero che questo possa aiutare!


6

Questo funziona:

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

o:

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

2

Se qualcuno li cerca, questo è un esempio per convertire un file CSV in Python 3:

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

2

A volte quando open(filepath)in cui in filepathrealtà non è un file si ottiene lo stesso errore, quindi innanzitutto assicurarsi che il file che si sta tentando di aprire esista:

import os
assert os.path.isfile(filepath)

spero che questo possa aiutare.


1

puoi provare in questo modo:

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

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post. - Dalla recensione
MartenCatcher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.