Pythonのcp932読み込みエラー対処法

冒頭まとめ PythonでテキストやCSVを読んだとき、次のエラーが出ることがあります。 UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 8: illegal multibyte sequence Pythonがcp932という文字コードで読もうとして、その規則では読めないバイト列に当たっています。UTF-8で保存されたファイルなら、読み込み側にもUTF-8を指定します。 with open("data.txt", encoding="utf-8") as f: text = f.read() ただし、エラーにcp932と出ることは、ファイル自体がUTF-8である証拠ではありません。保存元の設定やファイルの仕様を確認して、実際の文字コードに合わせてください。 cp932とファイルの文字コードが合っていない 文字コードは、文字と保存されたバイト列を対応させる規則です。cp932は日本語のWindowsで使われる文字コードの一つです。UTF-8とは異なる規則なので、UTF-8の内容をcp932として読むと失敗したり、文字化けしたりします。 Python 3.14のio公式文書は、文字コードを指定しないテキスト読み込みが地域設定に依存すること、UTF-8のファイルをそのまま開くとWindowsで問題になり得ることを説明しています。UTF-8モードが有効なら、既定値はUTF-8になります。 エラーの各部分は次を示します。 表示 確認できる内容 'cp932' codec 読み込みに使われた文字コード byte 0x86 問題になったバイトの値 position 8 例外の対象となったバイト列内の位置 illegal multibyte sequence cp932として不正な並び incomplete multibyte sequence 複数バイトで表す文字の並びが途中で終わっている 位置は行番号ではありません。テキスト読み込みで内部のバッファを処理している場合、ファイル全体の先頭からの位置とも限りません。値や位置は内容によって変わります。 また、今回の確認では、UTF-8の「日本」をcp932で読むと、例外を出さず「譌・譛ャ」になりました。エラーが出ないことだけでは、正しく読めたと判断できません。 保存元と実際の読み込み設定を確認する エディターの保存設定、出力した道具の仕様、ファイルを提供した側の説明で、UTF-8なのかcp932なのかを確認します。エディターが表示する推定値は、保存仕様そのものとは区別してください。 Python側は、エラーが出る同じ実行環境で確認します。 import sys print(sys.version) print(sys.executable) print(sys.flags.utf8_mode) with open("data.txt") as f: print(f.encoding) 最後の例は読み込み前に、実際に選ばれた文字コードを表示します。sys.flags.utf8_modeが1ならUTF-8モードが有効です。 Python 3.11以降なら、地域設定の文字コードも調べられます。 import locale print(locale.getencoding()) localeの公式文書によると、WindowsではANSIコードページを返します。ただし、この関数はUTF-8モードを無視します。返り値がcp932でも、文字コード未指定のopen()がUTF-8を使う場合があります。f.encodingと合わせて確認してください。 ...

2026年10月13日 · ErrorLog