Correggere la codifica dei caratteri in Python e pandas

pandas legge è al posto di è, si ferma con un UnicodeDecodeError o Excel mostra male il tuo CSV esportato? In Python il parametro encoding decide tra giusto e rotto. Ecco i casi tipici; i file rotti li ripari qui sopra, nel browser.

Funziona con testo e con questi file:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Per esempio esportazioni di Excel, backup di database, sottotitoli o codice di siti web.

Correggi

  1. Trascina un file o incolla il testo
  2. La correzione è automatica
  3. Copia o scarica
oppure trascina semplicemente un file qui
  • Nessun upload. I tuoi file vengono corretti direttamente nel browser e non lasciano mai il tuo dispositivo.

  • Server nell’UE. Mojibuster gira su un server in Finlandia (UE); si applica il Regolamento generale sulla protezione dei dati (GDPR). Testo del GDPR (EUR-Lex)

  • Per aziende e DPO: verifica tu stesso

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 solito cp1252 è 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.

Un CSV di pandas aperto in Excel senza BOM

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.

Altre guide