UnicodeDecodeError durante la lettura del file CSV in Panda con Python


412

Sto eseguendo un programma che sta elaborando 30.000 file simili. Un numero casuale di questi si sta arrestando e producendo questo errore ...

   File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
     return parser.read()
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
     ret = self._engine.read(nrows)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
     data = self._reader.read(nrows)
   File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
   File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
   File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
   File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
   File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
   File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
   File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
   File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

La fonte / creazione di questi file provengono tutti dallo stesso posto. Qual è il modo migliore per correggere questo per procedere con l'importazione?

Risposte:


824

read_csvprende encodingun'opzione per gestire i file in diversi formati. Uso principalmente read_csv('file', encoding = "ISO-8859-1"), o in alternativa encoding = "utf-8"per leggere, e generalmente utf-8per to_csv.

Puoi anche usare una delle diverse aliasopzioni come 'latin'invece di 'ISO-8859-1'(vedi documenti di Python , anche per numerose altre codifiche che potresti incontrare).

Vedi la documentazione Pandas pertinente , esempi di documenti python su file CSV e molte domande correlate qui su SO. Una buona risorsa di sfondo è ciò che ogni sviluppatore dovrebbe sapere su Unicode e set di caratteri .

Per rilevare la codifica (supponendo che il file contenga caratteri non ASCII), puoi usare enca(vedi la pagina man ) o file -i(linux) o file -I(osx) (vedi la pagina man ).


7
Poiché si tratta di un problema di Windows, cp1252potrebbe essere preferibile farlo iso-8859-1.
Tzot

7
Grazie ha pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')funzionato per me
Mona Jalal,

8
Non dare per scontato che una determinata codifica sia quella giusta solo perché non viene generata alcuna eccezione. Devi guardare le stringhe e capire se l'interpretazione ha un senso. Ad esempio, se si ottiene "antipasto" anziché "antipasto", probabilmente è necessario passare da ISO-8859-1 a ISO-8859-15.
Joachim Wagner

6
per me la codifica era ANSI. Per capirlo, ho aperto il CSV e notepadpoi ho fatto clic save as, lì mostra la codifica accanto al pulsante Salva.
Vaibhav Vishal,


69

La più semplice di tutte le soluzioni:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

Soluzione alternativa:

  • Apri il file CSV nell'editor di testo Sublime .
  • Salvare il file in formato utf-8.

In sublime, fai clic su File -> Salva con codifica -> UTF-8

Quindi, puoi leggere il tuo file come al solito:

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

e gli altri diversi tipi di codifica sono:

encoding = "cp1252"
encoding = "ISO-8859-1"

11
La domanda spiega che ci sono 30.000 di questi file. L'apertura manuale di ciascun file non sarebbe pratica.
Keith,

4
bene almeno per un file, questo sembrava funzionare per me!
apil.tamang

Il motore C è evidentemente più indulgente in ciò che accetta. Per un particolare file CSV che si apre bene con encoding='iso-8859-1', usando invece i engine='python'tiri _csv.Error: field larger than field limit (131072).
Greg Bacon,

1
una soluzione alternativa da utilizzare salva con la codifica è stata davvero utile! ecco come usarlo per VSCode stackoverflow.com/questions/30082741/...
brownmagik352

20

Panda consente di specificare la codifica, ma non consente di ignorare gli errori per non sostituire automaticamente i byte offensivi. Quindi non esiste una misura adatta a tutti i metodi ma a modi diversi a seconda del caso d'uso reale.

  1. Conosci la codifica e non c'è nessun errore di codifica nel file. Ottimo: devi solo specificare la codifica:

    file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
    
  2. Non vuoi essere disturbato dalle domande di codifica e vuoi solo caricare quel dannato file, non importa se alcuni campi di testo contengono spazzatura. Ok, devi solo usare la Latin1codifica perché accetta ogni possibile byte come input (e convertilo nel carattere unicode dello stesso codice):

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
  3. Sai che la maggior parte del file è scritta con una codifica specifica, ma contiene anche errori di codifica. Un esempio reale è un file UTF8 che è stato modificato con un editor non utf8 e che contiene alcune righe con una codifica diversa. Pandas non prevede un errore speciale di elaborazione, ma la openfunzione Python ha (supponendo Python3) e read_csvaccetta un file come oggetto. I parametri di errore tipici da utilizzare qui sono quelli 'ignore'che sopprimono i byte offensivi o (meglio IMHO) 'backslashreplace'che sostituiscono i byte offensivi con la sequenza di escape rovesciata del loro Python:

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
    pd.read_csv(input_fd, ...)
    

1
Risposta tardiva, ma mirata a una domanda duplicata ...
Serge Ballesta,

14
with open('filename.csv') as f:
   print(f)

dopo aver eseguito questo codice troverai la codifica di 'nomefile.csv', quindi esegui il codice come segue

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

ecco qua


6

Nel mio caso, un file ha una USC-2 LE BOMcodifica, secondo Notepad ++. È encoding="utf_16_le"per Python.

Spero, aiuta a trovare una risposta un po 'più veloce per qualcuno.


4

Nel mio caso questo ha funzionato per Python 2.7:

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

E per Python 3, solo:

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False) 

3

Prova a specificare engine = 'python'. Ha funzionato per me, ma sto ancora cercando di capire perché.

df = pd.read_csv(input_file_path,...engine='python')

Questo ha funzionato anche per me. Anche codifica = "ISO-8859-1". È sicuramente un problema di codifica. Se un carattere speciale è codificato in ANSI, ad esempio un carattere di ellisse (ovvero "...") e si tenta di leggerlo in UTF-8, è possibile che venga visualizzato un errore. In conclusione, è necessario conoscere la codifica con cui è stato creato il file.
Sean McCarthy,

3

Sto pubblicando una risposta per fornire una soluzione aggiornata e una spiegazione del perché questo problema può verificarsi. Supponi di ottenere questi dati da un database o da una cartella di lavoro di Excel. Se hai caratteri speciali come La Cañada Flintridge city, beh, a meno che tu non stia esportando i dati usando la UTF-8codifica, stai per introdurre errori. La Cañada Flintridge citydiventerà La Ca\xf1ada Flintridge city. Se si utilizza pandas.read_csvsenza alcuna modifica ai parametri predefiniti, verrà visualizzato il seguente errore

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

Fortunatamente, ci sono alcune soluzioni.

Opzione 1 , correggere l'esportazione. Assicurati di utilizzare la UTF-8codifica.

Opzione 2 , se fissa il problema esportatrice non è a disposizione di voi, e avete bisogno di usare pandas.read_csv, essere sicuri di includere le seguenti paramters, engine='python'. Per impostazione predefinita, Panda usa engine='C'che è l'ideale per leggere file puliti di grandi dimensioni, ma si bloccherà se si verifica qualcosa di imprevisto. Nella mia esperienza, l'impostazione encoding='utf-8'non ha mai risolto questo problema UnicodeDecodeError. Inoltre, non è necessario utilizzare errors_bad_lines, tuttavia, questa è ancora un'opzione se davvero ne avete bisogno.

pd.read_csv(<your file>, engine='python')

Opzione 3: la soluzione è la mia soluzione preferita personalmente. Leggi il file usando Python alla vaniglia.

import pandas as pd

data = []

with open(<your file>, "rb") as myfile:
    # read the header seperately
    # decode it as 'utf-8', remove any special characters, and split it on the comma (or deliminator)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# save the data as a dataframe
df = pd.DataFrame(data=data, columns = header)

Spero che questo aiuti le persone a riscontrare questo problema per la prima volta.


2

Ho lottato con questo per un po 'e ho pensato di pubblicare questa domanda in quanto è il primo risultato di ricerca. L'aggiunta del encoding="iso-8859-1"tag ai panda read_csvnon ha funzionato, né nessun'altra codifica, ha continuato a fornire un UnicodeDecodeError.

Se stai passando un handle di file pd.read_csv(),devi mettere l' encodingattributo sul file aperto, non in read_csv. Evidente col senno di poi, ma un sottile errore da rintracciare.


2

Si prega di provare ad aggiungere

encoding='unicode_escape'

Questo aiuterà. Ha funzionato per me. Inoltre, assicurati di utilizzare i nomi di colonna e delimitatore corretti.

Puoi iniziare caricando solo 1000 righe per caricare rapidamente il file.


1

Questa risposta sembra essere il punto di riferimento per i problemi di codifica CSV. Se stai riscontrando uno strano problema di codifica con l'intestazione in questo modo:

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

Quindi hai un carattere di marcatura ordine byte (BOM) all'inizio del tuo file CSV. Questa risposta risolve il problema:

Python ha letto csv - BOM incorporato nella prima chiave

La soluzione è caricare il CSV con encoding="utf-8-sig":

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

Spero che questo aiuti qualcuno.


1

Sto pubblicando un aggiornamento a questa vecchia discussione. Ho trovato una soluzione che ha funzionato, ma richiede l'apertura di ogni file. Ho aperto il mio file CSV in LibreOffice, ho scelto Salva con nome> modifica impostazioni filtro. Nel menu a discesa ho scelto la codifica UTF8. Poi ho aggiunto encoding="utf-8-sig"al data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig").

Spero che questo aiuti qualcuno.


Nisse, grazie per la modifica. Puoi per favore spiegare cosa hai cambiato? Non vedo differenza.
tshirtdr1,

1

Ho difficoltà ad aprire un file CSV in cinese semplificato scaricato da una banca online, ho provato latin1, ho provato iso-8859-1, ho provato cp1252, tutto inutilmente.

Ma pd.read_csv("",encoding ='gbk')semplicemente funziona.


0

Sto usando Jupyter-notebook. E nel mio caso, stava mostrando il file nel formato sbagliato. L'opzione 'codifica' non funzionava. Quindi salvo il csv in formato utf-8 e funziona.


0

Prova questo:

import pandas as pd
with open('filename.csv') as f:
    data = pd.read_csv(f)

Sembra che si occuperà della codifica senza esprimerla esplicitamente attraverso l'argomento


0

Controlla la codifica prima di passare ai panda. Ti rallenterà, ma ...

with open(path, 'r') as f:
    encoding = f.encoding 

df = pd.read_csv(path,sep=sep, encoding=encoding)

In Python 3.7


0

Un altro problema importante che ho riscontrato e che ha provocato lo stesso errore è stato:

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

^ Questa riga ha provocato lo stesso errore perché sto leggendo un file Excel usando il read_csv()metodo. Utilizzare read_excel()per leggere .xlxs


Caspita, tutti parlano di problemi di codifica. Sembra che il mio problema fosse strano.
Mujeeb Ishaque,

È perché hai un read_excelpanda.
Ani Menon,

0

Puoi provare questo.

import csv
import pandas as pd
df = pd.read_csv(filepath,encoding='unicode_escape')
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.