AIの業務活用

Claude Codeでエラーを直す:再現 → 原因 → 最小修正 → 再実行

AIに「エラーが出ます」とだけ伝えるのではなく、同じ入力で問題を再現し、実際の例外メッセージを根拠に原因を絞ってから最小限の修正だけを依頼する流れを練習します。amountにカンマが入ったCSVを使ってValueErrorを実際にPythonで再現し、修正コードも再実行して確認します。

目次を表示

対象読者Claude Codeで作った小さなPythonツールでエラーが起きたとき、エラーメッセージを根拠に修正プロセスをコントロールしたい初心者

準備するもの
  • 前の記事のsummarize.pyとexpenses.csvの流れを理解していること
  • ターミナルでpython summarize.py ファイル名の形式で実行できること
  • エラーが起きても元ファイルとエラーメッセージを先に残しておくこと
  • 実際の個人情報ではなく仮想CSVだけを使うこと

01修正する前に、同じ入力でまずエラーを再現する

エラーが起きたときの最初の段階は推測ではなく再現です。今回の例では、amountの値を一つだけ文字列"1,450"に変えた仮想CSVを使います。CSVの規則上、値の中にカンマが入るため引用符で囲みますが、csvモジュールで読み込んだ後のrow['amount']には文字列'1,450'が入ります。既存コードがint(row['amount'])をそのまま呼ぶと、この文字列を整数に変換できません。

プロンプト
date,category,amount
2026-09-01,food,12000
2026-09-03,transport,"1,450"
2026-09-03,food,8500
2026-09-10,supplies,3200
2026-09-15,transport,1450
2026-10-02,food,9800
プロンプト
import csv
import sys
from collections import defaultdict

path = sys.argv[1]
monthly = defaultdict(int)

with open(path, encoding="utf-8", newline="") as f:
    reader = csv.DictReader(f)
    for row in reader:
        month = row["date"][:7]
        monthly[month] += int(row["amount"])

for month in sorted(monthly):
    print(f"{month} = {monthly[month]}")

このコードを`python summarize_buggy.py expenses_bad.csv`で実行すると、正常な合計を出力する前に変換段階で停止します。GPTチャットのPythonツールで同じコードを実際に実行し、例外文字列が以下の文言と正確に一致することを確認しました。

プロンプト
ValueError: invalid literal for int() with base 10: '1,450'

02エラーメッセージから、失敗した値と処理を分けて読む

このメッセージにはすでに重要な手掛かりがあります。失敗した関数はint()、失敗した値は'1,450'です。したがって「CSV全体が間違っている」や「月別集計ロジックが間違っている」と最初から仮定する必要はありません。問題範囲はamount文字列を整数へ変換する箇所まで絞れます。

観察確認できた事実まだ推測してはいけないこと
例外の種類ValueErrorファイル全体が壊れていると断定しない
失敗した値'1,450'他のすべての行も間違っていると仮定しない
失敗した処理int()変換集計式そのものが間違っていると断定しない
修正範囲amountのパース箇所を優先プログラム全体を書き直さない

Claude Codeに助けを求めるときも、エラーメッセージ、再現コマンド、問題が起きた入力条件を一緒に渡します。そうすればAIの原因説明が実際の証拠につながっているか確認でき、問題と無関係な大規模修正が提案されたときも範囲を再び絞りやすくなります。

03原因を説明させてから、最小限の修正だけを依頼する

今回の修正要件は単純です。数値文字列内のカンマを削除してから整数に変換し、カンマを除いても数値でなければ、どの行のどの値で失敗したかが分かる明確なエラーを出す必要があります。月別集計方式と出力形式は変えません。

プロンプト
python summarize_buggy.py expenses_bad.csv を実行すると、以下のエラーが出ます。
ValueError: invalid literal for int() with base 10: '1,450'

まず原因を説明してください。
次にamount変換部分だけを最小限修正してください。
要件:
- カンマを含む数値文字列は、カンマを削除してから整数に変換
- それでも数値でなければ、行番号と元の値を含む明確なValueError
- 月別集計と出力形式はそのまま維持
- Python標準ライブラリだけを使用
- 修正後、どのコマンドで再実行するかも教えてください。

ここでは「コード全体を書き直して」とは頼みません。失敗箇所がamount変換まで絞れているため、その部分だけを直すよう範囲を制限します。AIが別ファイルや集計ルールまで変えようとするなら、まず必要な理由を説明させ、根拠がなければ元の範囲へ戻します。

04カンマ除去と行番号付きエラーを一つの関数にまとめる

以下の修正版はamountのパースをparse_amount()へ分離します。まずカンマを削除してint()を試し、失敗したら入力行番号と元の文字列を含むValueErrorを再送出します。csv.DictReaderのヘッダーが1行目なので、データ行番号はenumerate(reader, start=2)で合わせます。

プロンプト
import csv
import sys
from collections import defaultdict

def parse_amount(text, line_number):
    cleaned = text.replace(",", "")
    try:
        return int(cleaned)
    except ValueError as exc:
        raise ValueError(
            f"line {line_number}: amount must be an integer, got {text!r}"
        ) from exc

path = sys.argv[1]
monthly = defaultdict(int)

with open(path, encoding="utf-8", newline="") as f:
    reader = csv.DictReader(f)
    for line_number, row in enumerate(reader, start=2):
        month = row["date"][:7]
        monthly[month] += parse_amount(row["amount"], line_number)

for month in sorted(monthly):
    print(f"{month} = {monthly[month]}")

この修正は通貨記号、小数点、括弧付き負数など、あらゆる金額表現を処理する汎用パーサーではありません。今回実際に再現した千単位のカンマ問題だけを解決します。入力ルールを広げる場合は、許可する形式を先に決めてから別の要件として追加する方が安全です。

05同じファイルで再実行し、元の期待値と照合する

修正後は、問題を起こしたそのファイルでもう一度実行します。GPTチャットのPythonツールで上の修正コードを`expenses_bad.csv`に対して実際に実行した結果、月別合計は2026-09 = 26600, 2026-10 = 9800になりました。これはシリーズの最初から定めた期待値と正確に一致します。

プロンプト
python summarize_fixed.py expenses_bad.csv

2026-09 = 26600
2026-10 = 9800

エラーが消えたという事実だけで終わりにしません。カンマなしの1450とカンマありの"1,450"がどちらも同じ金額として解釈され、既存の正常結果を維持しているかを数値で確認することが再実行段階の要点です。

06数値でない値は黙って飛ばさず、位置付きで失敗させる

カンマ除去を追加したからといって、不正な値を0に変えたり無視したりしてはいけません。たとえば3行目のamountがabcなら、データエラーが隠れないよう失敗する必要があります。同じ修正コードを別の仮想入力で実際に実行し、`line 3`と元の値`'abc'`を含むValueErrorを確認しました。

プロンプト
date,category,amount
2026-09-01,food,12000
2026-09-03,transport,abc
プロンプト
ValueError: line 3: amount must be an integer, got 'abc'
  • 同じ入力でエラーが再現するか先に確認する。
  • 例外の種類と失敗した値を読み、修正範囲を絞る。
  • AIに原因を説明させてから最小限の修正だけを依頼する。
  • 問題を起こした入力で再実行し、元の期待値と比較する。
  • 不正な入力を黙って無視せず、見つけられるエラーとして残す。

自分で確認する項目

GPTチャットのPythonツールでPythonコードを実際に実行 · 仮想CSVだけを使用 · Claude Codeは実行していない

  • 既存のint(row['amount'])コードで'1,450'入力によりValueErrorが実際に再現するか確認
  • 例外文字列が"invalid literal for int() with base 10: '1,450'"と正確に一致するか確認
  • 修正コードがexpenses_bad.csvで例外なく実行されるか確認
  • 修正後のstdoutが正確に2026-09 = 26600, 2026-10 = 9800か確認
  • amount=abc入力で"line 3: amount must be an integer, got 'abc'" ValueErrorが実際に発生するか確認
  • Python標準ライブラリだけを使用しているか確認
検証範囲の限界

Pythonの実行検証はGPTチャットのPythonツールで行い、Claude Codeでテストしたとは主張しません。例のパーサーは千単位のカンマだけを処理し、通貨記号・小数点・地域別の数値形式まで一般化していません。