Penyebab dan penanggulangan UnicodeDecodeError [Python]

2019 6 年 月 日 5

Ketika saya mencoba membaca kumpulan data format file csv dengan panda, saya langsung menemukan kesalahan "UnicodeDecodeError: codec 'utf-8' tidak dapat mendekode byte 0x91 di posisi 1: byte mulai tidak valid", jadi saya menanyakan penyebabnya dan solusi Buat catatan itu.

isi kesalahan

Baca file csv dengan pd.read_csv.Kemudian...

impor panda sebagai pd df = pd.read_csv('data.csv')

>> UnicodeDecodeError: codec 'utf-8' tidak dapat mendekode byte 0x91 di posisi 1: byte awal tidak valid

Terjadi kesalahan decoding Unicode (mengonversi kode karakter menjadi karakter).
Omong-omong, mengubah karakter menjadi kode karakter disebut pengkodean.

Alasan

Di dalam komputer, karakter tidak dikenali sebagaimana adanya, tetapi ditangani sebagai angka (kode karakter) yang ditetapkan ke masing-masing karakter terlebih dahulu.

Ada banyak metode untuk pengkodean karakter, tergantung pada bahasa dan bagaimana angka diberikan. UTF-8 adalah salah satu metode pengkodean untuk Unicode yang telah ditetapkan sebagai standar global yang seragam sehingga dapat digunakan dalam bahasa apa pun.
Yang mengatakan, UTF-8 tampaknya juga tidak sempurna (Wikipedia:Masalah Unicode di lingkungan Jepang)

Saya tidak tahu karakter yang menyebabkan masalah, tetapi file csv berisi karakter Jepang, jadi kesalahan decoding Unicode disebabkan oleh tidak dapat mengkonversi kode karakter Jepang dan UTF-8 dengan baik.

larutan

Saat membaca dengan read_csv(), tentukan format penyandian sebagai kode karakter Jepang (seperti shift_jis) dari argumen.

df = pd.read_csv('data.csv', encoding='shift_jis')

Itu dimuat dengan baik sekarang.

Format Pengkodean lainnya untuk bahasa Jepang

Ngomong-ngomong, ada banyak kode karakter yang bisa mengekspresikan bahasa Jepang, dan Python mengimplementasikan yang berikut ini sebagai standar. ( referensi:Daftar pengkodean standar Python )

  • cp932
  • euc_jp, euc_jis_2004, euc_jisx0213
  • iso2022_jp, iso2022_jp_1, iso2022_jp_2, iso2022_jp_3
  • iso2022_jp_2004, iso2022_jp_2ext
  • shift_jis, shift_jis_2004, shift_jisx0213

Namun, saya mendapat kesan bahwa itu dapat dibaca dengan baik dengan shift_jis atau cp932, yang sebagian besar adalah mayor.