プログラミング

Pandasで日本語CSVが文字化けするときはcp932でエンコーディングしてみよう

PandasでCSVを読み込むときに出る UnicodeDecodeError と文字化けの原因を、文字コードの仕組みから説明します。pd.read_csv() が既定でUTF-8として読むこと、Excelで保存したCSVがcp932になりやすいこと、encoding='cp932' を指定して解決する方法、おまけとしてExcel側で文字化けしたときにメモ帳でANSI保存する手順をまとめました。

目次

はじめに

Pandasでcsvファイルをインポートするとき、以下のようなインポートエラーが出て途方に暮れることはありませんか。

# エラーメッセージの例
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 0: invalid start byte

また、読み取れたとしても、文字化けして読めないなんてこともありますよね。

このエラーは多くの場合、文字コードが原因となって発生するのですが、今回は解決方法の一つをご紹介します。

なぜエラーが発生するのか

私たちが普段見ている文字(「あ」や「A」など)は、実はコンピュータの中では数字の組み合わせとして保存されています。
この「文字と数字の対応規則」のことを「文字コード」や「エンコーディング」と呼びます。

例えば、同じ「あ」という文字でも、

  • UTF-8では「11100011 10000010 10000001」という数字で表現
  • cp932では「10000010 10000001」という数字で表現

というように、文字コードが違うと異なる数字で表現されます。

pandasの pd.read_csv() 関数は何も指定しない場合、ファイルをUTF-8のルールで読み込もうとします。
これはUTF-8が国際的な標準であるためです。

# このコードは内部的に encoding='utf-8' を想定して動いている
import pandas as pd
df = pd.read_csv('your_file.csv')

しかし、Excelなどで作成し、日本語を含むCSVファイルを普通に「CSV (カンマ区切り)」形式で保存すると、そのファイルはcp932(またはShift_JIS)でエンコードされることがよくあります。

このcp932で書かれたファイルを、pandasがデフォルトのUTF-8のルールで解釈しようとすると、UTF-8のルール上ありえないバイトの並びに出くわしてしまいます。

その結果、「このバイト列はルールブック(UTF-8)に載っていないので文字に変換できません」という UnicodeDecodeError が発生するのです。

なぜ cp932で解決するのか

当たり前の話ですが、cp932でエンコードされたファイルに対して、read_csv() の引数で encoding='cp932' と指定することは、pandasに「このファイルはcp932というルールで書かれているから、そのルールブックを使って読んでね」と正しく指示することになります。

import pandas as pd

# 'cp932'のルールでファイルを読み込むように明示的に指定
df = pd.read_csv('your_file.csv', encoding='cp932')

これにより、pandasは適切な変換ルールを用いてファイルを正しく解釈できるため、エラーが解消され、文字化けすることなくデータをDataFrameにインポートできます。

日本の業務で扱われるCSVファイルの多くは、Windows上のExcelで作成されるため、このcp932を指定することで解決するケースが非常に多いです。

また、cp932は、Shift_JISを拡張した文字コードです。
Shift_JISでは表示できない機種依存文字(①、㈱、㍉など)も、cp932なら正しく表示できるので、多くの場合、cp932を使用すると解決することが多いのです。

おまけ:Excelで文字化けが発生した場合の対処方法(Windows)

Windowsを使用しているとExcelでCSVを開いたときに文字化けしていることがありますよね。
あれは多くの場合、UTF-8でエンコーディングされたcsvを開くときに起きるのですが、簡単に解決する方法があります。

  • メモ帳でCSVファイルを開く
  • 「ファイル」→「名前を付けて保存」を選択します。
  • 「文字コード」という項目があるので「ANSI」で保存し、閉じた後再度開く。

これで大体の場合は解決すると思います。

まとめ

いかがでしたか。
知っていればなんともない話ですが、初心者が途方に暮れるポイントでもあります。
同じようなエラーに遭遇した場合、ぜひcp932を試してみてください。

この記事が誰かの役に立てばうれしいです。