出力元がCP932ならcp932でデコードし、UTF-8で別ファイルへ書き出します。Shift_JISとCP932は完全に同じではありません。文字コードが不明な状態で、エラーを無視して変換しないでください。
この記事の内容
対象・検証範囲:CPython 3.12.14 / Linux。掲載サンプルと期待する出力を照合。標準ライブラリのみ。
Shift_JISと指定して読めない場合
Windowsのシステムから出したCSVをshift_jisで読むと、一部の文字でUnicodeDecodeErrorになることがあります。出力元がCP932で、Shift_JISにない拡張文字を含むケースが候補です。
ただし、エラーだけで文字コードを確定することはできません。UTF-8のファイルを誤った指定で読んだ場合や、ファイルが途中で壊れた場合もあります。最初に出力元の仕様やエクスポート設定を確認します。
CP932の文字を含むサンプル
丸数字の「①」を含む例で、CP932とShift_JISの扱いを確認します。このコードは入力をCP932だと分かっている状態で作った検証例であり、未知のファイルの自動判定器ではありません。
import csv
import io
original = "id,name\n001,ノート①\n"
raw = original.encode("cp932")
try:
raw.decode("shift_jis")
except UnicodeDecodeError:
print("shift_jis: このサンプルは読めません")
text = raw.decode("cp932")
utf8 = text.encode("utf-8")
assert utf8.decode("utf-8") == original
row = next(csv.DictReader(io.StringIO(utf8.decode("utf-8"))))
print("変換後:", row["id"], row["name"])
try:
"ノート📘".encode("cp932")
except UnicodeEncodeError:
print("絵文字はcp932へ変換できません")
期待する結果と実ファイルでの処理
shift_jis: このサンプルは読めません
変換後: 001 ノート①
絵文字はcp932へ変換できません
実ファイルはopen("input.csv", encoding="cp932", newline="")で読み、別の出力ファイルへencoding="utf-8"を指定して書き込みます。文字コードだけを変えるなら、CSVの各行を再構成せず、読み込んだテキストを保存する方法でも対応できます。
出力先は新しいファイルにしてください。"x"モードなら同名ファイルがすでにある場合に止まります。Excel向けにBOM付きUTF-8が必要なら出力側をutf-8-sigにしますが、連携先の指定を優先します。
ignoreやreplaceで直したことにしない
errors="ignore"は変換できない部分を落とし、errors="replace"は代替文字へ置き換えます。処理が止まらなくなる一方、名前や識別子が変わる可能性があります。
文字が欠けても許されるログなどで明示的に使う場面はありますが、元のCSVの値を保つ目的には合いません。エラー位置を調べ、元ファイルを再取得するか、正しい文字コードの指定を確認します。
文字コードが分からないとき
自動判定ツールの結果は候補であり、証明ではありません。ASCII文字だけの部分は複数の文字コードで読めるため、エラーが出ないことも確定根拠にはなりません。
日本語や記号のある代表的な行を元画面と照合し、変換後のCSVを再度読み込んで値を確認します。この例はCPythonの指定環境でのサンプル検証であり、手元のファイルがCP932であることは検証していません。構造については列数・ヘッダーの検査を別に行います。
参考にした公式資料
- Python公式: codecs — エンコーディング確認日:2026.09.20
- Python公式: open — ファイルを開く確認日:2026.09.20
掲載サンプルは記載のPython環境で実行確認しています。すべてのOS・入力データを保証するものではありません。 編集・検証方針