PythonでCSVを集計したら、見た目には amount 列があるのに KeyError: 'amount'。そんなときは、列名を目で見るだけでは原因にたどり着けないことがあります。
以下は説明用に作った架空データの検証例です。お客様の案件や受託実績ではありません。
■ 今回の再現条件
列は amount と label の2つ。金額は1200と800の2行です。ファイルをBOM付きUTF-8で用意し、csv.DictReaderと encoding='utf-8' で読み込み、amount 列を合計しました。
期待する結果:2000
修正前の結果:KeyError: 'amount'
■ 原因を確かめる
この例では、先頭の列名に目に見えにくいBOMが残っていました。Pythonでは '\ufeffamount' と 'amount' は別の文字列です。実際の列名を repr で表示すると、この違いを確認できます。
■ 今回の変更
入力がBOM付きUTF-8だと確認できたため、読み取り時の指定を encoding='utf-8-sig' に変更しました。先頭のBOMを読み飛ばせるため、このデータでは正しい列名を取得できました。
■ 修正後の確認結果
Python 3.12.14で次の4点を確認しました。
・BOM付きUTF-8:合計2000
・BOMなしUTF-8:合計2000
・見出しだけでデータ行なし:合計0
・amount ではなく price という列名:引き続きKeyError
最後の確認も大切です。無関係な列名の間違いまで、空欄や0に置き換えて隠してしまわないためです。
この変更がすべてのCSVエラーを直すわけではありません。列名の空白、大文字・小文字、区切り文字、文字コードが別の原因になる場合もあります。まずは入力条件と実際に読めている列名を確かめます。
■ 修正を相談するときにあると助かるもの
エラー全文、期待する結果、Pythonのバージョン、コードのおおよその行数、同じ問題を再現できる架空データ。この5点があると、対応範囲を判断しやすくなります。パスワードやAPIキー、個人情報、社外秘情報は送らないでください。
小規模なPython修正サービスを公開しました。10,000円で、Pythonファイル1本・300行以内の不具合1件、修正コードと原因の説明、確認結果、修正1回が対象です。購入前に見積り相談で範囲・価格・納期を確認します。