PythonでCSVを読み込んだ瞬間に UnicodeDecodeError が出ても、CSV自体が壊れているとは限りません。
よくある原因は、ファイルを保存した側とPython側で「文字コード」の指定が一致していないことです。たとえば、日本語版Windowsから出力されたCSVがCP932なのに、PythonでUTF-8として読み込むと、日本語部分のバイト列を解釈できず処理が停止します。
今回は、完全な架空データでこのエラーを再現し、切り分ける順番を確認しました。実在する顧客案件や販売実績ではありません。
1. エラーが出た読み込み条件を固定する
最初に、使用したファイル、実行したコード、Pythonやpandasのバージョン、エラー全文を保存します。ここが曖昧だと、修正できたように見えても同じ条件で再発することがあります。
今回の再現例では、CP932のCSVを次のようにUTF-8固定で読んだため停止しました。
pd.read_csv(input_path, encoding="utf-8")
2. 文字コードを推測だけで決めない
日本語Windows由来のCSVはCP932の場合があります。作成元の仕様や保存設定を確認できるなら、それを優先します。
今回の入力はCP932と分かっていたため、読み込み側を次のように合わせました。
pd.read_csv(input_path, encoding="cp932")
エラーを消すために errors="ignore" で文字を捨てる方法は、氏名や商品名などが欠けても気づきにくいため、業務データでは慎重に扱う必要があります。
3. 「開けた」だけで完了にしない
読み込みに成功した後は、少なくとも次を確認します。
・行数が修正前の想定と一致する
・必須列が欠けていない
・日本語、金額、IDなど主要な値が変わっていない
・保存後のCSVをもう一度開ける
架空デモでは3件のデータを読み込み、必須列、日本語、地域、金額が保持されることをテストしました。出力は、Excelでの扱いやすさも考慮してBOM付きUTF-8(utf-8-sig)に統一しています。ただし、最適な出力形式は次に使うシステムの仕様で変わります。
まとめ
UnicodeDecodeError は、むやみにコード全体を書き換えるより、入力の文字コードと再現条件を揃えるほうが早く解決できる場合があります。
「昨日まで動いていたPythonが止まった」「ExcelやCSVを開く処理だけ直したい」という場合は、エラー全文と匿名化した最小サンプルがあると原因を切り分けやすくなります。
完全コードを自分で試したい方へ
この記事の確認手順に加え、標準ライブラリだけで動く診断・変換コード、自動テスト、安全チェックを1つのTXTにまとめました。元CSVを上書きせず、UTF-8・UTF-8 BOM・CP932を厳密に扱う500円の自動ダウンロード商品です。
再現可能なPython・Excelエラー1件について、原因説明、修正、動作確認まで行うサービスを出品しています。購入前の見積り相談で、対象範囲と安全に検証できる内容かを確認します。