概要
pandas
でencoding
をcp932
に指定してCSVファイルを読み込むコードを実装していたら、以下のエラーが返されました。本記事ではこのエラーの原因と解決方法を記載します。
UnicodeDecodeError: 'cp932' codec can't decode byte 0x81 in position 2407: illegal multibyte sequence
上記は、文字列をデコードしようとした際に、'cp932'
(Shift-JIS)というエンコーディング方式を使用した際に発生しています。
原因
UnicodeDecodeError
は、指定されたエンコーディングに基づいてバイト列を文字列にデコードしようとしたときに、不正なマルチバイトシーケンスが見つかったことを意味するエラー。実際のファイルの文字コードと読み込み時に指定した文字コードが異なっているときに表示される変換エラーです。
0x81
というバイト列はShift-JIS
エンコーディングにおいて特定の文字を表すために使用されていますが、Shift-JIS
のルールに従わない場合、デコードエラーが発生するのです。
以下のどちらかの場合が多いとのこと。
・テキストファイルや文字列が正しいエンコーディングで保存されていない
・ファイル内の特定のバイト列がエンコーディングに合致しない
エンコーディングについてややこしい点は、
・Mac環境でCSVファイルを作成する際のデフォルトのエンコーディングは、一般的にUTF-8
ですが、
・Windows環境でCSVファイルを作成する際のデフォルトのエンコーディングは、一般的にcp932
(Shift-JIS)エンコーディングが多い
ということ。
なのでCSVデータが出力された環境によって適切に指定してあげる必要があります。
解決方法
・CSVファイル内の文字列データがUTF-8エンコードされている可能性が高いです。
encoding
をutf-8
にしてあげると解決しました。
csv_encoding = "utf-8" # エンコーディングを指定
data = pd.read_csv(csv_file_path, encoding=csv_encoding)
ということで、Windows環境で作成されたCSVファイルをUNIX系環境やMac環境で扱う際には、エンコーディングの違いに注意する必要があるでしょう。
参考
【Python】UnicodeDecodeError: 'cp932' codec can't decodeの原因と解決方法