目次を開く
CSVの一部だけ列数が多い、引用符が閉じていない、といった壊れ方をすると、pandasの読み込みで問題行が発生します。ここで重要なのは「とにかく読み込む」ことではなく、問題行をどう扱うかを明示することです。
まずerrorで止めて位置を知る
品質確認の段階では、エラーを握りつぶさず止める方が原因を特定しやすくなります。
import pandas as pd
df = pd.read_csv("data.csv", on_bad_lines="error")
処理件数だけ見て成功と判断せず、入力行数と出力行数も比較します。
skipを使うなら欠落件数を記録する
業務上どうしても問題行を飛ばす場合でも、何件捨てたか分からない運転にしないことが重要です。原本を残し、除外レコードを別ログへ出す設計にします。
Parserの前に構造チェックを入れる
列数不一致や引用符崩れは、データ型の問題より前に検出できます。構造エラーを先に止めれば、pandas側の処理を単純に保てます。
その前段チェックには、CSV Preflightで列数不一致や引用符崩れを確認できます。
本番投入前の最終チェック
入力行数、正常に読めた行数、問題行数を別々に記録します。skip で完走したことを成功扱いせず、落としたレコードを復旧できる状態にしておきます。
on_bad_linesの方針を明示した- 入力件数と出力件数を比較した
- 問題行を保存した
- 原本を残した
- 修正後に再読込した
処理が最後まで走ったことと、全データを正しく読めたことは別です。
問題行を別ファイルへ残す
定期バッチで skip を採用する場合は、捨てた行を後から追えるようにします。入力ファイル名、処理日時、問題行の位置、原因をログへ残し、修正後に再投入できる形にします。入力件数 = 正常件数 + 保留件数という関係を毎回確認すれば、処理成功の陰でレコードが静かに減る事故を防げます。0件捨てたのか、捨てた件数を知らないのかは分けて記録します。