PythonでCSVがUnicodeDecodeErrorになる原因と直し方|文字コードを初心者向けに解説

PythonでCSVのエラーを解決。CP932のCSVを例に、文字コードを合わせて読み込む流れ。 Python・データ解析

CSVを読み込もうとしたら、UnicodeDecodeErrorという長いエラーが出た。そんなときは、CSVの文字コードと読み込み方が合っていない可能性があります。

この記事では、CP932で保存した日本語CSVを使ってエラーを再現し、正しいencodingを指定して読み込めるようにします。ゴールは、日本語の列名とデータが正しく表示されることです。

今回使うCSVを用意する

次のサンプルをダウンロードしてください。文字コードの確認用に作った架空のデータで、実測値ではありません。ファイルはCP932で保存しています。

temperature_cp932.csvをダウンロード

時間,温度
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つです。

行番号時間温度
0020
1123
2227
3330

「時間」「温度」が文字化けせず、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指定後の表・先頭行・列名を確認しました。画面やエラー表示は環境によって多少異なります。

参考:pandas公式:read_csv/Python公式:文字コード

コメント

タイトルとURLをコピーしました