read_csvで列数が合わずParserErrorになる

Prep

read_csvで列数が合わずParserErrorになる

作成日: 最終更新: 読了時間: 1 分

pandas.read_csv() で次のようなエラーに遭遇したことはありませんか?

pandas.errors.ParserError: Error tokenizing data. C error: Expected 5 fields in line 12, saw 7

あるいは

pandas.errors.ParserError: ',' expected after '"'

といったメッセージです。これは 区切り文字や引用符の扱いが想定と違う ときに起こります。
主な原因は次のパターンです。

  • CSV がタブ区切り (\t) やセミコロン区切り (;) だった
  • 1列内にカンマが含まれていて、引用符で囲まれていなかった
  • エスケープ文字がなく、ダブルクオートが途中で途切れている

解決法 1: 区切り文字を正しく指定する #

import pandas as pd

# セミコロン区切り
df = pd.read_csv("sales.csv", sep=";")

# タブ区切り
df = pd.read_csv("log.tsv", sep="\t")

ファイルの先頭数行を head -n やメモ帳で確認し、実際の区切り文字を把握してから sep= を設定しましょう。


解決法 2: 引用符とエスケープを合わせる #

df = pd.read_csv("survey.csv", quotechar="'", escapechar="\\")

Excel から書き出した CSV では セル内のカンマ改行 が混入していることがあります。
引用符 (quotechar) を明示し、バックスラッシュなどでエスケープされている場合は escapechar も指定します。


解決法 3: Python エンジンで柔軟に解析する #

標準の C エンジンでは扱えない複雑なパターンも engine="python" へ切り替えると読み込めることがあります。

df = pd.read_csv(
    "messy.csv",
    engine="python",
    sep=",",
    quotechar='"',
    on_bad_lines="warn",  # 破損行は警告だけ出してスキップ
)

on_bad_lines="skip" にすると崩れた行を無視できます。
データ損失を防ぎたい場合は warn にしてログだけ取り、後で該当行を手動で修正しましょう。


チェックリスト #

  1. 区切り文字 は想定通りか (sep を設定したか)
  2. セル内カンマ改行 がある列には適切な引用符が付いているか
  3. Excel 等で書き出す際、CSV UTF-8 (カンマ区切り) 以外を選んでいないか
  4. 破損行がある場合は on_bad_lines でログを出しながら再確認したか

参考 #