UnicodeDecodeError in lettura
pd.read_csv si aspetta UTF-8. Se il file è salvato in Windows-1252 (ANSI), pandas si ferma con UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8; 0xE8 è la è in Windows-1252. Allora indica la codifica:
pd.read_csv('dati.csv', encoding='cp1252')per i file di Excel e di Windows.encoding='latin-1'non fallisce mai, ma legge male€e virgolette tipografiche; di solitocp1252è la scelta migliore.- Se non conosci la codifica, trascina il file in Mojibuster: la riconosce e salva il file in UTF-8.
è al posto di è nel DataFrame
Se il DataFrame mostra è, un file UTF-8 è stato letto come latin-1 o cp1252, oppure i dati erano già rotti. Nel primo caso basta encoding='utf-8'. Se sono i dati stessi a essere rotti, valore.encode('cp1252').decode('utf-8') aiuta con singoli valori. Con dati misti, però, fallisce appena una cella è già corretta. Più semplice: ripara il file con Mojibuster e poi leggilo.
Prima
nome,città ,fatturato Niccolò Perché,Perugia,1250 € Giuliana Lù,Città di Castello,980 €
Dopo
nome,città,fatturato Niccolò Perché,Perugia,1250 € Giuliana Lù,Città di Castello,980 €
to_csv: Excel mostra male il file
df.to_csv('export.csv') scrive UTF-8 senza BOM. Excel apre questi file come ANSI e le lettere accentate diventano è. Con encoding='utf-8-sig', pandas scrive un BOM ed Excel riconosce l'UTF-8. Altro su Excel e caratteri strani.
open() su Windows
open('file.txt') senza encoding usa su Windows la codifica di sistema, di solito cp1252. Uno script che funziona su Linux legge allora lo stesso file UTF-8 come è su Windows. Passa quindi sempre encoding='utf-8' oppure imposta la variabile d'ambiente PYTHONUTF8=1. Con la PEP 686, UTF-8 diventerà comunque il valore predefinito nelle future versioni di Python.
Dati dal web con requests
requests ricava response.text dall'intestazione Content-Type. Se una risposta di testo non indica lì il charset, presume ISO-8859-1 e le pagine UTF-8 mostrano è. Imposta prima response.encoding = 'utf-8' oppure usa response.json(), che riconosce da solo l'UTF-8.
Se il testo è stato scritto con errors='replace' in una codifica priva dei caratteri necessari, il file contiene ?; allora l'informazione è perduta, vedi punti interrogativi al posto degli accenti.
Domande frequenti
Esiste una libreria Python per questo?
Sì, ftfy corregge il mojibake nel codice Python. Per singoli file, senza programmare, Mojibuster è più veloce e ti mostra ogni modifica prima di salvare.
Quali valori di encoding mi servono di più?
utf-8, utf-8-sig (UTF-8 con BOM), cp1252 (Windows, Europa occidentale), latin-1 e utf-16. Maiuscole e trattini non contano.
Separatori e numeri restano invariati?
Sì. Mojibuster modifica solo i caratteri rotti. Virgole, virgolette e a capo restano esattamente come sono.