errore UnicodeDecodeError: il codec 'utf-8' non può decodificare byte 0xff in posizione 0: byte iniziale non valido


164

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

Si è verificato un errore durante la compilazione di "process.py" sul sito sopra.

 python tools/process.py --input_dir data --            operation resize --outp
ut_dir data2/resize
data/0.jpg -> data2/resize/0.png

Traceback (ultima chiamata più recente):

File "tools/process.py", line 235, in <module>
  main()
File "tools/process.py", line 167, in main
  src = load(src_path)
File "tools/process.py", line 113, in load
  contents = open(path).read()
      File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
  (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode     byte 0xff in position 0: invalid start byte

Qual è la causa dell'errore? La versione di Python è 3.5.2.

Risposte:


196

Python tenta di convertire una matrice di byte (una bytesche assume essere una stringa codificata utf-8) in una stringa unicode ( str). Questo processo ovviamente è una decodifica secondo le regole utf-8. Quando prova questo, incontra una sequenza di byte che non è consentita nelle stringhe con codifica utf-8 (vale a dire questo 0xff nella posizione 0).

Dal momento che non hai fornito alcun codice che potremmo esaminare, potremmo solo indovinare il resto.

Dalla traccia dello stack possiamo supporre che l'azione di innesco sia stata la lettura da un file ( contents = open(path).read()). Propongo di ricodificarlo in questo modo:

with open(path, 'rb') as f:
  contents = f.read()

Quello bnello specificatore di modalità negli open()stati in cui il file deve essere trattato come binario, quindi contentsrimarrà a bytes. Nessun tentativo di decodifica avverrà in questo modo.


Viene visualizzato l'errore "ValueError: la stringa di modalità deve iniziare con una di 'r', 'w', 'a' o 'U', non 'br'"
Unnikrishnan,

3
@Unnikrishnan Ok, quindi usa rb(pensavo che l'ordine non avesse importanza, ma sembra esserlo, almeno in alcuni sistemi / versioni). Ho modificato la mia risposta di conseguenza.
Alfe,

57
byte 0xff in position 0potrebbe anche significare che il file è codificato in UTF-16, quindi puoi fare with open(path, encoding='utf-16') as f:invece
Nikolai R Kristiansen,

Cosa succede se in realtà non ci sono 0xffpersonaggi in posizione 0? Ed è UTF-8codificato.
Iulian Onofrei,

Un '\xFF'carattere puro verrà codificato in UTF-8 come '\xC3\xBF'. UTF-8 codifica tutti i caratteri con un set MSB usando due caratteri. (Vedi l'output di printf "\xff" | iconv -f latin1 -t utf-8 | xxdin una shell.) Un termine '\xFF'all'inizio di una stringa codificata UTF-8 è un errore di codifica (potrebbe essere chiamato un errore di sintassi in termini di UTF-8).
Alfe,

83

Utilizzare questa soluzione eliminerà (ignorerà) i caratteri e restituirà la stringa senza di essi. Usalo solo se hai bisogno di toglierli e non convertirli.

with open(path, encoding="utf8", errors='ignore') as f:

Usando errors='ignore' Perderai solo alcuni personaggi. ma se non ti interessa di loro in quanto sembrano essere caratteri extra provenienti da una cattiva formattazione e programmazione dei client che si collegano al mio server socket. Quindi è una soluzione semplice e diretta. riferimento


6
Funziona anche per decodifica (): contents = contents.decode('utf-8', 'ignore')Fonte: docs.python.org/3/howto/unicode.html#the-string-type
naaman

2
Dovrebbe essere la risposta migliore
Statham,

migliore soluzione nel mio caso d'uso :)
Maestromusica,

Quando dici "perde alcuni caratteri" intendi che il file con errori non verrà letto? o che non verrà letto tutto il contenuto di quel file?
msoutopico,

@msoutopico Poiché sta ignorando gli errori, non verranno lette alcune codifiche che causano problemi. Ma non ho mai trovato alcun contenuto che è stato ignorato durante la lettura. Quindi sostanzialmente i problemi di ecoding vengono ignorati.
Nitish Kumar Pal

23

Ha avuto un problema simile a questo, è finito con UTF-16 per decodificare. il mio codice è sotto.

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

questo prenderebbe il contenuto del file come importazione, ma restituirebbe il codice in formato UTF. da lì sarebbe decodificato e separato da linee.


10
In Python 3 puoi semplificarlo usando il parametro di codificawith open(path, encoding='utf-16') as f
Nikolai R Kristiansen,

@NikolaiRKristiansen Ho provato a usare il tuo metodo, ma ho riscontrato un errore TypeError: an integer is required (got type str). Perché? Entrambi i file sono binari e letti come rb.
Bogota,

1
@Bogota Il encodingparametro ha senso solo quando si legge il testo. Rilascia la "b" dall'argomento mode e riprova. Maggiori informazioni nei documenti: docs.python.org/3/library/functions.html#open
Nikolai R Kristiansen

19

Utilizzare il formato di codifica ISO-8859-1 per risolvere il problema.


1
Finalmente è arrivato su questo dopo aver provato oltre 10 altre codifiche!
Rexcirus,

15

Mi sono imbattuto in questo thread quando ho riscontrato lo stesso errore, dopo aver fatto alcune ricerche posso confermare, questo è un errore che si verifica quando si tenta di decodificare un file UTF-16 con UTF-8.

Con UTF-16 il primo carattere (2 byte in UTF-16) è un Byte Order Mark (BOM) , che viene utilizzato come suggerimento per la decodifica e non viene visualizzato come carattere nella stringa decodificata. Ciò significa che il primo byte sarà FE o FF e il secondo, l'altro.

Fortemente modificato dopo aver scoperto la vera risposta


Questo è finito 2 ore di mal di testa! Aprendo il file con open ('nomefile', 'r') come f: e quindi stampando il suo contenuto mostra UTF-8, che è sbagliato.
nulldroid,


3

Se sei su un Mac, controlla se è presente un file nascosto, .DS_Store. Dopo aver rimosso il file il mio programma ha funzionato.


1

Controlla il percorso del file da leggere. Il mio codice continuava a darmi errori fino a quando non ho cambiato il nome del percorso per presentare la directory di lavoro. L'errore era:

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

1

se stai ricevendo dati da una porta seriale, assicurati di usare il baudrate corretto (e le altre configurazioni): decodifica usando ( utf-8 ) ma la configurazione sbagliata genererà lo stesso errore

UnicodeDecodeError: il codec 'utf-8' non può decodificare byte 0xff in posizione 0: byte iniziale non valido

per verificare la configurazione della tua porta seriale su linux usa: stty -F /dev/ttyUSBX -a


1

Significa semplicemente che uno ha scelto la codifica sbagliata per leggere il file.

Su Mac, usa file -I file.txtper trovare la codifica corretta. Su Linux, usa file -i file.txt.


0

Ho lo stesso problema durante l'elaborazione di un file generato da Linux. Si scopre che era in relazione con file contenenti punti interrogativi ..


-1

Ho avuto un problema simile.

Risolto da:

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

Tuttavia, ho avuto un altro problema. Alcuni file html (nel mio caso) non erano utf-8, quindi ho ricevuto un errore simile. Quando ho escluso quei file html, tutto ha funzionato senza problemi.

Quindi, a parte correggere il codice, controlla anche i file da cui stai leggendo, forse c'è davvero un'incompatibilità lì.


-5

Se possibile, aprire il file in un editor di testo e provare a modificare la codifica in UTF-8. In caso contrario, farlo a livello di codice a livello di sistema operativo.


-5

Ho un problema simile. Provo ad eseguire un esempio in tensorflow / models / goal_detection e ho incontrato lo stesso messaggio. Prova a cambiare Python3 in Python2

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.