PythonのUnicodeDecodeErrorとは?意味・原因・CSVの直し方を初心者向けに解説

PythonでCSVファイルやテキストファイルを読み込んだときに、次のようなエラーが表示されることがあります。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 12: invalid start byte
英語のエラーメッセージだけを見ると難しく感じますが、UnicodeDecodeErrorの多くは、ファイルの文字コードとPythonで指定した文字コードが合っていないことが原因です。
例えば、cp932で保存されたCSVファイルをUTF-8として読み込もうとすると、Pythonが一部の文字を正しく変換できず、UnicodeDecodeErrorが発生します。
この記事では、UnicodeDecodeErrorの意味や主な原因、CSVファイルを読み込むときの直し方を初心者向けに解説します。
ほかのPythonエラーについて調べたい場合は、Pythonエラー一覧も参考にしてください。


UnicodeDecodeErrorとは
UnicodeDecodeErrorとは、バイトデータを文字列へ変換するデコード処理に失敗したときに発生するエラーです。
CSVファイルやテキストファイルの中身は、コンピューター上ではバイトデータとして保存されています。Pythonでファイルを読み込むときは、そのバイトデータをUTF-8やcp932などの文字コードに従って、人が読める文字列へ変換します。
このとき、指定した文字コードのルールでは変換できないデータが見つかると、UnicodeDecodeErrorが発生します。
簡単に言うと、Pythonが「このファイルを指定された文字コードでは正しく読めません」と知らせているエラーです。
エンコードとデコードの違い
文字コードに関するエラーを理解するために、エンコードとデコードの違いを確認しておきましょう。
| 処理 | 変換の方向 | 使用される場面 |
|---|---|---|
| エンコード | 文字列からバイトデータへ変換する | ファイルへの書き込みやデータの送信 |
| デコード | バイトデータから文字列へ変換する | ファイルの読み込みやデータの受信 |
例えば、「こんにちは」という文字列をファイルに保存するときは、文字列をバイトデータへエンコードします。反対に、そのファイルをPythonで読み込むときは、バイトデータを文字列へデコードします。
UnicodeDecodeErrorは、後者のデコード処理で発生するエラーです。ファイルを読み込む際に指定した文字コードと、実際にファイルで使われている文字コードが一致しているかを確認することが、解決の基本となります。
UnicodeDecodeErrorのエラーメッセージの意味
UnicodeDecodeErrorが発生すると、使用した文字コードや問題が見つかった位置などがエラーメッセージに表示されます。
次のメッセージを例に、表示内容を確認してみましょう。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 12: invalid start byte
各部分には、次のような意味があります。
| 表示 | 意味 |
|---|---|
UnicodeDecodeError | バイトデータから文字列への変換に失敗した |
'utf-8' codec | UTF-8としてデコードしようとした |
can't decode byte 0x93 | 0x93というバイトを文字に変換できなかった |
position 12 | ファイル内の位置12付近で問題が見つかった |
invalid start byte | UTF-8の文字として正しくない開始バイトだった |
この例では、PythonがファイルをUTF-8として読み込もうとしましたが、UTF-8のルールでは解釈できないバイトが見つかっています。
ただし、このメッセージだけで正しい文字コードが確定するわけではありません。ファイルがcp932なのか、別の文字コードなのか、あるいはテキスト以外のデータが含まれているのかを確認する必要があります。
エラーに表示された文字コードを適当に変更するのではなく、ファイルが実際にどの文字コードで保存されているかを確認し、その文字コードをPython側でも指定することが大切です。
UnicodeDecodeErrorが起きる主な原因
UnicodeDecodeErrorが発生する代表的な原因は、ファイルで使われている文字コードと、Python側で指定した文字コードが一致していないことです。
ただし、文字コードの指定ミス以外にも、ファイル形式やデータの状態が原因になる場合があります。まずは、主な原因と確認するポイントを整理しておきましょう。
| 原因 | 具体的な状況 | 確認するポイント |
|---|---|---|
| 文字コードの指定が間違っている | cp932のファイルをUTF-8として読み込んでいる | ファイルが実際にどの文字コードで保存されているか |
encodingを指定していない | 実行環境の標準文字コードで読み込まれている | open()やread_csv()の指定内容 |
| CSVファイルの作成元が異なる | Excelや外部システムから出力されたCSVを読み込んでいる | CSVの保存形式や出力設定 |
| テキストではないファイルを開いている | 画像やExcelファイルをテキストとして読み込んでいる | ファイルの種類や拡張子 |
| データの一部が壊れている | 一部に不正なバイトや異なる文字コードが含まれている | エラーが発生した位置付近のデータ |
| UTF-8とcp932を反対に指定している | UTF-8のファイルをcp932として読み込んでいる | Python側の指定とファイルの文字コードが一致しているか |
ファイルとPythonで文字コードが一致していない
最も多い原因は、ファイルの文字コードとPythonで指定した文字コードが一致していないことです。
例えば、cp932で保存されたCSVファイルを、次のようにUTF-8として読み込むと、UnicodeDecodeErrorが発生する可能性があります。
with open("sales.csv", "r", encoding="utf-8") as file:
text = file.read()このコードでは、Pythonがsales.csvをUTF-8のルールで文字列に変換しようとします。
しかし、実際のファイルがcp932で保存されている場合、UTF-8では解釈できないバイトが含まれているため、デコード処理に失敗します。
反対に、UTF-8で保存されたファイルをcp932として読み込んだ場合にも、同じようなエラーが発生することがあります。
そのため、「UnicodeDecodeErrorが出たらcp932を指定する」と覚えるのではなく、ファイルで使われている文字コードを確認し、同じ文字コードをPython側に指定することが重要です。
encodingを指定していない
open()でファイルを開くときにencodingを省略すると、実行環境で設定されている標準の文字コードが使用されます。
with open("data.csv", "r") as file:
text = file.read()この書き方では、同じプログラムでも、使用しているOSやPythonの実行環境によって読み込み結果が変わる可能性があります。
あるパソコンでは正常に動いていても、別のパソコンではUnicodeDecodeErrorが発生することもあります。
文字コードが分かっている場合は、次のようにencodingを明示しておくと安全です。
with open("data.csv", "r", encoding="utf-8") as file:
text = file.read()ファイルがcp932で保存されている場合は、encoding="cp932"を指定します。
with open("data.csv", "r", encoding="cp932") as file:
text = file.read()環境に依存しないプログラムにするためにも、テキストファイルを読み込むときはencodingを明示する習慣をつけておきましょう。
CSVファイルの作成元によって文字コードが異なる
CSVファイルは、作成したソフトや出力元のシステムによって文字コードが異なることがあります。
例えば、自分でUTF-8として保存したCSVと、Excelや業務システムから出力したCSVでは、同じ.csvという拡張子でも文字コードが異なる場合があります。
| CSVの作成例 | 使用される可能性がある文字コード |
|---|---|
| プログラムから出力したCSV | UTF-8 |
| Excelから保存したCSV | cp932やUTF-8 |
| 業務システムから出力したCSV | cp932や独自の設定 |
| Webサービスから取得したCSV | UTF-8など |
ただし、作成元だけで文字コードを断定することはできません。保存時の設定やシステムの仕様によって異なるため、実際のファイルを確認する必要があります。
特に、ほかの人から受け取ったCSVや外部サービスからダウンロードしたCSVでは、どの文字コードで保存されているかを確認してから読み込むことが大切です。
テキストではないファイルを開いている
UnicodeDecodeErrorは、画像やExcelファイルなど、テキストではないファイルを文字列として読み込んだ場合にも発生します。
例えば、PNG画像を次のようにテキストモードで開くと、Pythonは画像のバイトデータをUTF-8の文字列へ変換しようとします。
with open("image.png", "r", encoding="utf-8") as file:
data = file.read()画像データは通常のテキストではないため、UTF-8では正しくデコードできません。
バイナリデータとして読み込む場合は、rではなくrbを指定します。
with open("image.png", "rb") as file:
data = file.read()また、Excelファイルを読み込む場合は、open()で直接文字列として読み込むのではなく、openpyxlやpandasなど、ファイル形式に対応したライブラリを使用します。
ファイルの拡張子が.csvなのか、.xlsxなのか、.pngなのかを確認し、形式に合った読み込み方法を選びましょう。
ファイル内のデータが壊れている
文字コードの指定が正しくても、ファイル内の一部に不正なデータが含まれていると、UnicodeDecodeErrorが発生することがあります。
例えば、次のような状況が考えられます。
- ファイルの一部だけ別の文字コードで保存されている
- ダウンロードやコピーの途中でデータが壊れた
- 不正なバイトが含まれている
- 複数のファイルを誤った方法で結合した
エラーメッセージにposition 100のような位置が表示されている場合は、その付近のデータに問題がある可能性があります。
ただし、表示される位置は行番号ではなく、データ内のバイト位置を表していることがあります。そのため、該当する行を正確に特定できるとは限りません。
文字コードを正しく指定してもエラーが直らない場合は、元のファイルを開き直したり、再度出力したりして、データ自体に問題がないかを確認しましょう。
UnicodeDecodeErrorを解決するときは、最初に文字コードの不一致を確認し、それでも直らない場合にファイル形式やデータの破損を調べると、原因を見つけやすくなります。
UnicodeDecodeErrorのエラー例と修正例
UnicodeDecodeErrorを直すには、エラーが発生したコードと、読み込もうとしているファイルの文字コードを照らし合わせることが大切です。
ここでは、CSVやテキストファイルの読み込みでよくあるエラー例を取り上げ、修正方法を順番に解説します。
cp932のCSVをUTF-8で読み込んでいる
日本語を含むCSVファイルでは、cp932で保存されたファイルをUTF-8として読み込んだことが原因で、UnicodeDecodeErrorが発生する場合があります。
例えば、sales.csvがcp932で保存されているにもかかわらず、次のようにencoding="utf-8"を指定したとします。
with open("sales.csv", "r", encoding="utf-8") as file:
text = file.read()
print(text)このコードを実行すると、次のようなエラーが表示されることがあります。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 12: invalid start byte
Pythonはsales.csvをUTF-8のルールで読み込もうとしています。しかし、ファイル内にはUTF-8では正しく解釈できないバイトが含まれているため、デコード処理に失敗しています。
ファイルがcp932で保存されていることが分かっている場合は、encodingを次のように修正します。
with open("sales.csv", "r", encoding="cp932") as file:
text = file.read()
print(text)修正前と修正後の違いを整理すると、次のようになります。
| コードの指定 | 実際の文字コード | 結果 |
|---|---|---|
encoding="utf-8" | cp932 | UnicodeDecodeErrorが発生する可能性がある |
encoding="cp932" | cp932 | 正常に読み込める |
大切なのは、エラーが出たからといって、すぐにcp932へ変更することではありません。
ファイルが実際にcp932で保存されていることを確認したうえで指定しましょう。
UTF-8のファイルをcp932で読み込んでいる
UnicodeDecodeErrorは、cp932のファイルをUTF-8で読み込んだ場合だけに発生するわけではありません。
反対に、UTF-8で保存されたファイルをcp932として読み込んだ場合にも、同じようなエラーが発生する可能性があります。
with open("data.csv", "r", encoding="cp932") as file:
text = file.read()
print(text)この例でdata.csvがUTF-8で保存されている場合、cp932のルールでは解釈できないデータが見つかり、読み込みに失敗することがあります。
ファイルがUTF-8で保存されているなら、次のように修正します。
with open("data.csv", "r", encoding="utf-8") as file:
text = file.read()
print(text)文字コードの組み合わせと結果は、次の表のとおりです。
| Python側の指定 | ファイルの文字コード | 結果 |
|---|---|---|
| cp932 | UTF-8 | UnicodeDecodeErrorが発生する可能性がある |
| UTF-8 | UTF-8 | 正常に読み込める |
UnicodeDecodeErrorの解決では、UTF-8とcp932のどちらが優れているかではなく、ファイルとPython側の指定が一致しているかが重要です。
encodingを指定せずにファイルを開いている
open()でencodingを指定しなかった場合、Pythonは実行環境の標準文字コードを使ってファイルを読み込みます。
例えば、次のコードでは文字コードが明示されていません。
with open("data.csv", "r") as file:
text = file.read()
print(text)この書き方では、パソコンや実行環境によって使用される文字コードが変わる可能性があります。
そのため、自分のパソコンでは正常に動いていても、別の環境で実行するとUnicodeDecodeErrorが発生することがあります。
ファイルがUTF-8で保存されている場合は、次のように指定します。
with open("data.csv", "r", encoding="utf-8") as file:
text = file.read()
print(text)ファイルがcp932で保存されている場合は、次のように指定します。
with open("data.csv", "r", encoding="cp932") as file:
text = file.read()
print(text)encodingを明示することで、実行環境による違いを減らし、どの文字コードで読み込んでいるのかも分かりやすくなります。
テキストファイルやCSVファイルを扱うときは、できるだけencodingを指定する習慣をつけておきましょう。
pandasのread_csv()でUnicodeDecodeErrorが出る
pandasを使ってCSVファイルを読み込む場合も、文字コードが合っていないとUnicodeDecodeErrorが発生します。
例えば、cp932で保存されたCSVをUTF-8として読み込むと、次のコードでエラーになることがあります。
import pandas as pd
df = pd.read_csv("sales.csv", encoding="utf-8")
print(df)sales.csvがcp932で保存されている場合は、encodingを次のように変更します。
import pandas as pd
df = pd.read_csv("sales.csv", encoding="cp932")
print(df)一方、CSVがUTF-8で保存されている場合は、encoding="utf-8"を指定します。
import pandas as pd
df = pd.read_csv("sales.csv", encoding="utf-8")
print(df)open()とpandas.read_csv()の指定方法を比べると、次のようになります。
| 読み込み方法 | UTF-8を指定する例 | cp932を指定する例 |
|---|---|---|
open() | encoding="utf-8" | encoding="cp932" |
pd.read_csv() | encoding="utf-8" | encoding="cp932" |
pandasを使う場合でも、基本的な考え方はopen()と同じです。
CSVファイルが実際にどの文字コードで保存されているかを確認し、それと同じ値をencodingに指定します。
BOM付きUTF-8のCSVを読み込んでいる
UTF-8で保存されたCSVの中には、ファイルの先頭にBOMと呼ばれる情報が付いているものがあります。
BOM付きUTF-8のファイルでは、通常のencoding="utf-8"でも読み込める場合がありますが、列名の先頭に見えない文字が付くなど、意図しない結果になることがあります。
そのような場合は、utf-8-sigを指定して読み込みます。
with open("data.csv", "r", encoding="utf-8-sig") as file:
text = file.read()
print(text)pandasで読み込む場合も、同じように指定できます。
import pandas as pd
df = pd.read_csv("data.csv", encoding="utf-8-sig")
print(df)UTF-8とBOM付きUTF-8の主な違いは、次のとおりです。
| 文字コード | 指定例 | 主な用途 |
|---|---|---|
| UTF-8 | encoding="utf-8" | 通常のUTF-8ファイル |
| BOM付きUTF-8 | encoding="utf-8-sig" | ファイル先頭にBOMが付いているUTF-8ファイル |
ただし、UnicodeDecodeErrorが発生したからといって、必ずutf-8-sigへ変更すればよいわけではありません。
ファイルがBOM付きUTF-8であることを確認してから使用しましょう。
テキストではないファイルを文字列として読み込んでいる
UnicodeDecodeErrorは、画像やExcelファイルなどをテキストファイルとして開いた場合にも発生します。
例えば、PNG画像を次のように読み込むと、Pythonは画像のデータをUTF-8の文字列へ変換しようとします。
with open("image.png", "r", encoding="utf-8") as file:
data = file.read()画像ファイルは通常のテキストではないため、UTF-8として正しくデコードすることはできません。
画像の中身をバイトデータとして読み込む場合は、rではなくrbを指定します。
with open("image.png", "rb") as file:
data = file.read()
print(type(data))この場合、読み込まれたデータは文字列ではなく、bytes型になります。
また、Excelファイルを扱う場合は、バイナリモードで開くだけでは表の内容を取得できません。pandasやopenpyxlなど、Excel形式に対応したライブラリを使用します。
import pandas as pd
df = pd.read_excel("sales.xlsx")
print(df)ファイルの種類に応じた読み込み方法を整理すると、次のようになります。
| ファイルの種類 | 主な読み込み方法 |
|---|---|
| テキストファイル | open() |
| CSVファイル | open()またはpd.read_csv() |
| 画像ファイル | open()のバイナリモード |
| Excelファイル | pd.read_excel()やopenpyxl |
文字コードを変更してもエラーが直らない場合は、そもそも読み込もうとしているファイルがテキスト形式なのかを確認してみましょう。
UnicodeDecodeErrorが発生したときは、まずファイルの文字コードとencodingの指定を確認します。それでも解決しない場合は、ファイル形式やデータの状態に問題がないかを調べると、原因を絞り込みやすくなります。
UnicodeDecodeErrorに関するよくある質問
ここでは、PythonのUnicodeDecodeErrorについて、初心者が疑問に感じやすいポイントをまとめます。
エラーメッセージの意味やCSVの文字コード、cp932とshift_jisの違いなど、解決するときに迷いやすい点を順番に確認していきましょう。
「utf-8 codec can’t decode byte」とはどういう意味ですか?
'utf-8' codec can't decode byteは、PythonがデータをUTF-8として読み込もうとしたものの、UTF-8の文字として解釈できないバイトが見つかったことを表しています。
例えば、次のようなエラーメッセージが表示されることがあります。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 12: invalid start byte
このメッセージから分かるのは、PythonがUTF-8を使ってデコードしようとしたことと、途中にUTF-8では読み取れないデータがあったことです。
ただし、このエラーだけでは、正しい文字コードが何であるかまでは分かりません。ファイルがcp932やShift_JISで保存されている可能性もあれば、ファイルの一部が壊れている可能性もあります。
まずは、ファイルの作成元や保存時の設定を確認し、実際の文字コードに合ったencodingを指定しましょう。
CSVを読み込むとUnicodeDecodeErrorが出るのはなぜですか?
CSVを読み込んだときにUnicodeDecodeErrorが出る主な原因は、CSVファイルの文字コードとPython側の指定が一致していないことです。
例えば、cp932で保存されたCSVをUTF-8として読み込むと、エラーが発生する可能性があります。
with open(
"sales.csv",
"r",
encoding="utf-8"
) as file:
text = file.read()ファイルがcp932であることが分かっている場合は、次のように修正します。
with open(
"sales.csv",
"r",
encoding="cp932"
) as file:
text = file.read()pandasのread_csv()を使う場合も、同じように文字コードを指定します。
import pandas as pd
df = pd.read_csv(
"sales.csv",
encoding="cp932"
)
print(df)CSVという形式そのものが原因ではなく、CSV内のバイトデータをどの文字コードとして読み込むかが問題です。
また、CSVの中に壊れたデータが含まれている場合や、拡張子だけが.csvで実際には別形式のファイルである場合にも、UnicodeDecodeErrorが発生することがあります。
utf-8とcp932のどちらを指定すればよいですか?
UTF-8とcp932のどちらを指定するかは、ファイルが実際にどの文字コードで保存されているかによって決まります。
使い分けの考え方は、次のとおりです。
| ファイルの文字コード | Pythonでの指定 |
|---|---|
| UTF-8 | encoding="utf-8" |
| BOM付きUTF-8 | encoding="utf-8-sig" |
| cp932 | encoding="cp932" |
UnicodeDecodeErrorが出たときに、UTF-8とcp932を適当に切り替えるだけでは、正しく読み込めたか判断できないことがあります。
エラーが表示されなくても、日本語が文字化けしたり、一部の文字が異なる記号になったりする可能性があるためです。
ファイルを作成したソフトの保存設定や、テキストエディタの文字コード表示を確認し、その結果に合ったencodingを指定しましょう。
cp932とshift_jisはどちらを使えばよいですか?
cp932とshift_jisは似ていますが、Pythonでは異なる文字コードとして扱われます。
どちらを使うかは、ファイルが実際にどの文字コードで保存されているかによって判断します。
両者の違いを簡単に整理すると、次のようになります。
| 指定 | 特徴 |
|---|---|
encoding="cp932" | Windowsの日本語環境で使われることが多い |
encoding="shift_jis" | 日本語向けのShift_JISとしてデコードする |
Windows上のソフトや業務システムから出力された日本語CSVでは、cp932が使われていることがあります。
一方で、ファイルの仕様書や保存設定にShift_JISと明記されている場合は、shift_jisを指定します。
ただし、作成元が「Shift_JIS」と案内していても、実際にはWindows向けのcp932を指している場合があります。shift_jisで読み込めないときは、出力元の仕様を確認したうえでcp932も検討しましょう。
errors=”ignore”を指定すれば解決できますか?
errors="ignore"を指定すると、デコードできない部分を読み飛ばして処理を続けられる場合があります。
with open(
"data.csv",
"r",
encoding="utf-8",
errors="ignore"
) as file:
text = file.read()ただし、これはUnicodeDecodeErrorの原因を解決しているわけではありません。
読み取れなかった文字が削除されるため、氏名、住所、商品名、金額などの重要なデータが欠ける可能性があります。エラーが表示されなくなることで、データの欠損に気づきにくくなる点にも注意が必要です。
読み取れない場所を確認したい場合は、errors="replace"を使う方法もあります。
with open(
"data.csv",
"r",
encoding="utf-8",
errors="replace"
) as file:
text = file.read()この場合、デコードできない部分は�などの置換文字として表示されます。
どちらの方法でも元の文字を正確に復元することはできません。基本的には、ファイルの文字コードを確認し、正しいencodingを指定することを優先しましょう。
同じコードなのに別のパソコンではエラーになるのはなぜですか?
encodingを省略していると、実行環境によって使用される標準の文字コードが異なるため、別のパソコンでUnicodeDecodeErrorが発生することがあります。
例えば、次のコードでは文字コードを指定していません。
with open("data.csv", "r") as file:
text = file.read()この書き方では、Pythonが実行環境の標準設定を使ってファイルを読み込みます。
ある環境ではファイルと標準の文字コードが一致して正常に動いても、別の環境では一致せず、UnicodeDecodeErrorが発生することがあります。
ファイルがUTF-8であることが分かっている場合は、次のように明示します。
with open(
"data.csv",
"r",
encoding="utf-8"
) as file:
text = file.read()ファイルがcp932の場合は、encoding="cp932"を指定します。
実行環境に左右されにくいコードにするためにも、テキストファイルやCSVを読み込むときは、文字コードを明示しておくことが大切です。
UnicodeDecodeErrorが出ない文字コードを自動で選べますか?
Pythonの標準機能だけで、すべてのファイルの文字コードを正確に自動判定することは困難です。
外部ライブラリを使って文字コードを推測する方法はありますが、結果はあくまで推測です。特に、英数字だけのファイルや短い文章では、複数の文字コードで問題なく読めるため、正しく判定できないことがあります。
自動判定を使う場合でも、次の点を確認する必要があります。
| 確認する内容 | 理由 |
|---|---|
| 日本語が文字化けしていないか | エラーがなくても誤って読める場合がある |
| 列名やデータが欠けていないか | 不正な文字が削除される場合がある |
| 作成元の設定と一致しているか | 推測結果が間違っている可能性がある |
| 行数や列数が正しいか | 読み込み結果に異常がないか確認するため |
重要なファイルでは、自動判定だけに頼らず、保存時の設定や提供元の仕様も確認しましょう。
UnicodeDecodeErrorを例外処理で無視してもよいですか?
try文とexcept文を使えば、UnicodeDecodeErrorが発生してもプログラム全体が停止しないようにできます。
try:
with open(
"data.csv",
"r",
encoding="utf-8"
) as file:
text = file.read()
except UnicodeDecodeError as error:
print("ファイルを正しく読み込めませんでした")
print(error)ただし、例外処理を追加しても、ファイルを正しく読み込めるようになるわけではありません。
例外処理は、エラーが発生したことを利用者へ知らせたり、別の処理へ切り替えたりするために使います。文字コードの不一致そのものは、正しいencodingを指定して解決する必要があります。
複数の文字コードが想定される場合は、候補を順番に試す方法もあります。
encodings = ["utf-8", "cp932"]
for encoding in encodings:
try:
with open(
"data.csv",
"r",
encoding=encoding
) as file:
text = file.read()
print(f"{encoding}で読み込みました")
break
except UnicodeDecodeError:
print(f"{encoding}では読み込めませんでした")この方法を使う場合も、正常に読み込めたように見えるだけで文字化けしていないか、内容を確認することが大切です。
まとめ|UnicodeDecodeErrorは文字コードの確認が大切
UnicodeDecodeErrorは、ファイルなどのバイトデータを文字列へ変換できなかったときに発生するエラーです。
多くの場合は、ファイルで使われている文字コードと、open()やpandas.read_csv()で指定したencodingが一致していません。
エラーが出たときは、UTF-8やcp932を手当たり次第に試すのではなく、ファイルの作成元や保存時の設定を確認し、実際の文字コードに合った値を指定しましょう。
また、errors="ignore"やerrors="replace"を使うと処理を続けられる場合がありますが、文字の欠損や置き換えが発生するため、根本的な解決にはなりません。
UnicodeDecodeErrorが発生したときは、次の流れで確認すると原因を見つけやすくなります。
- 読み込んでいるファイルとファイル形式を確認する
- ファイルの実際の文字コードを調べる
- Python側の
encodingを一致させる - 読み込み後に文字化けやデータの欠損がないか確認する
エラーメッセージを落ち着いて読み、ファイルの文字コードとPython側の指定を見直せば、多くのUnicodeDecodeErrorは解決できます。
ほかのエラーの意味や直し方を調べたい場合は、「Pythonエラー一覧」も参考にしてください。

