UnicodeDecodeErrorの原因と対処法【Python】

2019年6月5日

pandasで csvファイル 形式のデータセットを読み込もうとしたら、さっそく「UnicodeDecodeError: 'utf-8’ codec can’t decode byte 0x91 in position 1: invalid start byte」というエラーに遭遇したので、その原因と解決策をメモしておきます。

エラー内容

csvファイルをpd.read_csvにて読み込みます。すると…

import pandas as pd
df = pd.read_csv('data.csv')

>> UnicodeDecodeError: 'utf-8’ codec can’t decode byte 0x91 in position 1: invalid start byte

Unicodeのデコード(文字コードを文字に変換すること)エラーが出ました。
ちなみに文字を文字コードに変換することはエンコードといいます。

原因

パソコン内部では、文字をそのままの形で認識しているわけではなく、事前に個々の文字に割り当てた番号(文字コード)として取り扱っています。

文字コードには言語や番号の割り当て方の違いによって多くの方式があります。UTF-8は、どの言語で使えるように、世界標準の統一規格として設定されたUnicode用の符号化方式の1つです。
とはいえ、UTF-8も完全ではないようです(Wikipedia:日本語環境でのUnicodeの諸問題

問題の原因となった文字はわかりませんがcsvファイルには日本語文字が含まれていたため、 日本語の文字コードとUTF-8とをうまく変換できていないことがUnicodeデコードエラーの原因になったと思われます。

解決策

read_csv()で読み込むときに、 encoding形式を引数から日本語の文字コード(shift_jisなど)に指定してやる。

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

これでうまく読み込めました。

その他の日本語対応のEncodings形式

ちなみに日本語を表現できる文字コードは複数あり、Pythonが標準で実装しているのは以下のものです。 ( 参照:List of Python standard encodings )

  • 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

ただ、だいたいはメジャーどころの shift_jis か cp932 でうまく読み込めるようになっている印象です。