PythonでCSVの文字コードを確かめる教材 / Kredo Blog

この教材は架空の商品3件を使います。実際の顧客情報や業務ファイルは不要です。
検証環境：Python 3.12.14 / macOS。標準ライブラリのみ。追加パッケージ不要。

【ファイル】
sample_utf8.csv      UTF-8、BOMなし
sample_utf8_bom.csv  UTF-8、BOMあり
sample_cp932.csv     CP932
3ファイルとも列名は「商品,数量」、データは「りんご,2」「みかん,3」「バナナ,4」です。

01_read_three.py     3種類を指定した文字コードで読む
02_check_bom.py      先頭BOMと列名を比べる
03_wrong_encoding.py CP932をUTF-8で読んだエラーと正しい読み方を比べる
04_convert.py       元CSVを残し別名のBOM付きUTF-8へ変換する
05_no_silent_loss.py ignore/replaceによる欠落とCP932/shift_jisの違いを観察する
expected-output.txt  実行結果の答え合わせ
README.txt          この案内

【実行】
ZIPを専用の練習フォルダーに展開し、そのフォルダーをターミナルで開きます。
Python 3が利用できる環境で、次を一つずつ実行します。

python3 01_read_three.py
python3 02_check_bom.py
python3 03_wrong_encoding.py
python3 04_convert.py
python3 05_no_silent_loss.py

Python 3をpythonまたはpyというコマンドで使う環境では、python3の部分をそのコマンドに置き換えます。
各.pyファイルはUTF-8で保存されています。コードをコピーして試す場合も同名の.pyへ保存してください。
__file__を使うため、対話画面やノートブックへの部分貼り付けではなく、保存した.pyを実行します。

04だけが新しいCSVを作成します。出力先は同じフォルダーのconverted_utf8_bom.csvです。
既に同名出力があれば上書きせず停止します。再度変換するときはコードのtargetを別の出力名に変更してください。
その他のスクリプトはCSVを変更しません。

【読み方】
01の各行は、ファイル名、列名、データ件数、数量合計の順です。
数量は2+3+4=9、データ件数は3です（ヘッダーは件数に含めません）。
02ではBOM付きUTF-8をutf-8で読むと、最初の列名の先頭に\ufeffが残ります。
03のUnicodeDecodeErrorは、教材で意図的に出して捕捉するエラーです。
05のignoreによる空文字は、復元成功を意味しません。

このコードは小さな教材CSV用で、会社のデータを自動判定・一括変換するツールではありません。
実データでは出力元の文字コード、区切り、列名、改行の仕様を確認し、コピーで検証してください。
変換後の確認は列名・件数・各値が元の正しいデータと一致するかを比べます。

記事：https://kredo.jp/media/python-csv-encoding-utf8-bom-cp932/
