"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.