Last Updated on 2025年7月28日
Pythonでファイル読み込みやエンコーディング処理を行う際に発生しやすい「UnicodeDecodeError: 'utf-8' codec can't decode byte 0xXX in position X」エラーについて、その原因や具体的な解決策を解説します。文字コードに関する知識が少しでもあると、対処がスムーズになるため、初学者にもわかりやすく丁寧に紹介していきます。
目次
エラー内容
Pythonでファイルを開いたり文字列を扱ったりしていると、以下のようなエラーが出力されることがあります。
|
1 |
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xXX in position X: invalid start byte |
このエラーは、「utf-8」でデコードしようとしたバイト列が、UTF-8として不正な形式になっている場合に発生します。byte 0xXX はデコードに失敗したバイト、position X はそのバイトの位置を示しています。
原因
このエラーが出る主な原因は次の通りです:
- ファイルの実際の文字コードがUTF-8ではない
たとえばShift_JISやISO-8859-1(Latin-1)でエンコードされたファイルを、encoding='utf-8'で開こうとするとエラーになります。 - バイナリファイルや画像・音声ファイルなどをテキストとして読み込もうとしている
テキストとして解釈できないデータをデコードしようとすると、当然ながらUnicodeDecodeErrorになります。 - 一部のバイト列が壊れている、もしくは途中で文字コードが変化している
通常のテキストファイルでも、編集履歴や結合処理の影響でバイト列が混在している場合にこのエラーが発生します。
対処法
状況に応じた複数の対処方法を紹介します。
1. 文字コードを調べて正しく指定する
ファイルがUTF-8以外の文字コードでエンコードされている場合、正しいエンコーディングを指定して開く必要があります。
|
1 2 3 4 |
with open('example.txt', 'r', encoding='shift_jis') as f: text = f.read() |
LinuxやmacOSでは以下のようにして文字コードを確認できます:
|
1 2 |
$ file -i example.txt example.txt: text/plain; charset=shift_jis |
また、Pythonでchardetパッケージを使って自動判定する方法もあります:
|
1 2 3 4 5 6 7 8 9 10 11 |
import chardet with open('example.txt', 'rb') as f: raw_data = f.read() result = chardet.detect(raw_data) encoding = result['encoding'] with open('example.txt', 'r', encoding=encoding) as f: text = f.read() |
2. エラーを無視して読み込む
どうしてもエラーを回避したい場合は、エラー処理を指定することで読み込みを続けることも可能です:
|
1 2 3 4 |
with open('example.txt', 'r', encoding='utf-8', errors='ignore') as f: text = f.read() |
errors='replace' を指定すると、問題のあるバイトを「�」に置き換えて読み込むことができます。
3. バイナリモードで読み込む
画像やバイナリデータの場合、そもそもテキストとして読み込むべきではありません。
|
1 2 3 4 |
with open('image.jpg', 'rb') as f: binary_data = f.read() |
4. 文字コードをUTF-8に変換して保存し直す
テキストエディタ(VSCode、Notepad++など)でファイルを開き、「UTF-8で保存」することでも回避可能です。
補足
Python 3以降のデフォルトはUTF-8です。ただし、Windowsでは環境によりcp932(Shift_JIS相当)が使われることがあるため、特に注意が必要です。
また、コマンドラインやOSによってファイルの文字コードが異なる場合があるため、読み込む前に確認しておくと安心です。
まとめ
UnicodeDecodeErrorは、指定した文字コードと実際の文字コードが一致していないときに発生するchardetなどで正しい文字コードを自動判定するのが便利- バイナリファイルは
'rb'モードで扱うこと errors='ignore'などで応急処置も可能だが、根本的な原因を突き止めた方がよい- エディタで文字コードをUTF-8に統一することで、再発を防げる
このエラーは非常に頻繁に発生しますが、正しい知識を持っていれば恐れることはありません。地道に原因を調査し、適切な対処を行いましょう。


