CSVを読み込もうとしたら、UnicodeDecodeErrorという長いエラーが出た。そんなときは、CSVの文字コードと読み込み方が合っていない可能性があります。
この記事では、CP932で保存した日本語CSVを使ってエラーを再現し、正しいencodingを指定して読み込めるようにします。ゴールは、日本語の列名とデータが正しく表示されることです。
今回使うCSVを用意する
次のサンプルをダウンロードしてください。文字コードの確認用に作った架空のデータで、実測値ではありません。ファイルはCP932で保存しています。
時間,温度
0,20
1,23
2,27
3,30
Google Colabでノートブックを開き、左側のフォルダアイコンを押して、ダウンロードしたCSVをアップロードします。今回はdataフォルダを作らず、最初に表示される場所へ置いてください。ファイル名は変更しません。
上の内容をコピーして別のファイルに保存すると、文字コードが変わってエラーを再現できないことがあります。今回は配布ファイルをそのまま使います。
※Colabのセッションが終了すると、アップロードしたファイルは消えることがあります。その場合は再度アップロードしてください。
Colabでの操作やCSVの基本から確認したい場合は、Pythonで初めてのグラフ作成|CSVの意味からGoogle Colabでの操作までを参考にしてください。
普通にread_csv()してエラーを再現する
まず、文字コードを指定せずに実行します。この段階では、エラーが出ることを確認します。
import pandas as pd
df = pd.read_csv("temperature_cp932.csv")
Colabでは、エラーの最後に次の一文が表示されました。長い表示のうち、ここだけ確認すれば大丈夫です。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte
エラーに含まれる数値や表示の長さは、ファイルや環境によって変わります。FileNotFoundErrorが出た場合は文字コードとは別の問題なので、アップロード先とファイル名を先に確認してください。
UnicodeDecodeErrorはなぜ起こる?
CSVの文字は、ファイルの中ではバイト列という数値の並びで保存されています。それを文字に戻すときの読み方が、文字コードです。
保存時と読み込み時の文字コードが合っていないと、正しく文字に変換できず、UnicodeDecodeErrorが発生することがあります。
今回のCSVはCP932で保存されています。一方、pd.read_csv()は文字コードを指定しない場合、UTF-8として読み込みます。この違いが今回のエラーの原因です。
encoding=”cp932″を指定する
次のコードを別のセルで実行します。CSVの保存時に合わせて、encoding="cp932"を追加します。
df = pd.read_csv(
"temperature_cp932.csv",
encoding="cp932"
)
df
正常に読み込めたことを確認する
実行すると、次の表が表示されました。左端の0〜3は行の番号で、CSVの列は「時間」と「温度」の2つです。
| 行番号 | 時間 | 温度 |
|---|---|---|
| 0 | 0 | 20 |
| 1 | 1 | 23 |
| 2 | 2 | 27 |
| 3 | 3 | 30 |
「時間」「温度」が文字化けせず、4行の数値が表示されたら成功です。
cp932を指定すれば何でも直るわけではない
今回はCP932で保存したCSVなので、CP932を指定すると読めました。すべてのUnicodeDecodeErrorがこの指定で直るわけではありません。
大切なのは、CSVを保存したときの文字コードに合わせて読み込むことです。UTF-8のCSVならUTF-8を使います。分からない場合は、CSVを出力したソフトの保存設定や、ファイルの提供元に確認しましょう。
CP932とShift_JISの違いは?
CP932は、Windowsで使われてきたShift_JIS系の文字コードです。日本語WindowsやExcel由来のCSVで出会うことがあります。ただし、すべてのExcelのCSVがCP932とは限りません。
CP932とShift_JISはよく似ていますが、扱える文字などに違いがあり、Pythonでは別の文字コードとして用意されています。この記事では細かな規格の違いよりも、保存時の文字コードを確認して指定することを押さえましょう。
df.head()とdf.columnsで中身を確認する
読み込めたら、先頭のデータも確認します。df.head()は先頭5行を表示する命令です。今回は4行なので、上と同じ表が表示されました。
df.head()
次のコードを別のセルで実行すると、列名を確認できます。
df.columns
今回の出力は次のとおりです。「時間」「温度」が正しく取得できています。
Index(['時間', '温度'], dtype='object')
エラーがなくても文字化けしている場合
間違った文字コードでも、エラーにならず、別の文字として読み込まれる場合があります。エラーが消えただけで判断せず、列名と日本語のデータが元のCSVと合っているかを確認してください。
文字化けしていたら、保存時の文字コードを確認し、合うencodingで元のCSVを読み直します。
完成コード
今回のCP932のCSVを読み込み、先頭のデータを確認するコードです。
import pandas as pd
df = pd.read_csv(
"temperature_cp932.csv",
encoding="cp932"
)
df.head()
列名も確認するときは、続けて別のセルでdf.columnsを実行してください。
まとめ
UnicodeDecodeErrorが出たら、保存時と読み込み時の文字コードが合っているかを確認します。今回はCP932のCSVにencoding="cp932"を指定し、日本語の列名と4行のデータを読み込めました。
読み込み後は、df.head()とdf.columnsで内容を確認する。この一手間までを、CSVを読み込むときの流れにしてみてください。
参考・動作確認環境
Google Colabで動作確認(2026年9月14日):Python 3.13.15/pandas 2.2.3。配布CSVでエラーを再現し、CP932指定後の表・先頭行・列名を確認しました。画面やエラー表示は環境によって多少異なります。


コメント