UnicodeDecodeError saat membaca
pd.read_csv mengharapkan UTF-8. Kalau file disimpan dalam Windows-1252 (ANSI), pandas berhenti dengan UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9; 0xE9 adalah é di Windows-1252. Sebutkan encodingnya:
pd.read_csv('data.csv', encoding='cp1252')untuk file dari Excel dan Windows.encoding='latin-1'tidak pernah gagal, tetapi salah membaca€dan tanda kutip tipografis;cp1252biasanya pilihan yang lebih baik.- Kalau tidak tahu encodingnya, seret file ke Mojibuster: encoding dikenali dan file disimpan sebagai UTF-8.
é alih-alih é di DataFrame
Kalau DataFrame menampilkan é, file UTF-8 terbaca sebagai latin-1 atau cp1252, atau datanya memang sudah rusak. Pada kasus pertama, encoding='utf-8' sudah cukup. Kalau datanya sendiri rusak, nilai.encode('cp1252').decode('utf-8') membantu untuk nilai tunggal. Pada data campuran, cara ini gagal begitu ada sel yang sudah benar. Lebih mudah: perbaiki file dengan Mojibuster, lalu baca.
Sebelum
nama,kota,omzet René Müller,Zürich,1250 € José GarcÃa,Málaga,980 €
Sesudah
nama,kota,omzet René Müller,Zürich,1250 € José García,Málaga,980 €
to_csv: Excel menampilkan file dengan salah
df.to_csv('ekspor.csv') menulis UTF-8 tanpa BOM. Excel membuka file seperti itu sebagai ANSI dan huruf beraksen berubah menjadi é. Dengan encoding='utf-8-sig', pandas menulis BOM dan Excel mengenali UTF-8. Selengkapnya di karakter aneh di Excel.
open() di Windows
open('berkas.txt') tanpa encoding memakai encoding sistem di Windows, biasanya cp1252. Skrip yang jalan di Linux lalu membaca file UTF-8 yang sama sebagai é di Windows. Jadi selalu berikan encoding='utf-8' atau atur variabel lingkungan PYTHONUTF8=1. Lewat PEP 686, UTF-8 memang akan menjadi bawaan di versi Python mendatang.
Data web dengan requests
requests menurunkan response.text dari header Content-Type. Kalau respons teks tidak menyebut charset di sana, ISO-8859-1 diasumsikan dan halaman UTF-8 menampilkan é. Atur dulu response.encoding = 'utf-8', atau pakai response.json() yang mengenali UTF-8 sendiri.
Kalau teks ditulis dengan errors='replace' ke encoding yang tidak punya karakter yang dibutuhkan, file berisi ?: informasinya hilang, lihat tanda tanya pengganti huruf.
Pertanyaan yang sering diajukan
Apakah ada library Python untuk ini?
Ada, ftfy memperbaiki mojibake di kode Python. Untuk file tunggal tanpa pemrograman, Mojibuster lebih cepat dan menunjukkan setiap perubahan sebelum disimpan.
Nilai encoding mana yang paling sering dipakai?
utf-8, utf-8-sig (UTF-8 dengan BOM), cp1252 (Windows, Eropa Barat), latin-1, dan utf-16. Huruf besar-kecil dan tanda hubung tidak berpengaruh.
Apakah pemisah dan angka tetap aman?
Ya. Mojibuster hanya mengubah karakter yang rusak. Koma, tanda kutip, dan baris baru tetap persis seperti semula.