Pythonでpandasを使ってCSVファイルを読み込んでいると、以下のようなエラーに遭遇することがあります。
ParserError: Error tokenizing data. C error: Expected 1 fields in line 8, saw 2
一見すると難解なこのエラーですが、実際にはCSVファイルの中に想定外の形式の行が含まれていることが原因です。
今回はこのエラーの意味と、実際に私が遭遇した事例、そして有効だった対処法について解説いたします。
エラーの意味:行ごとの列数が一致していない
このエラーは、pandas.read_csv() でCSVファイルを読み込む際に、特定の行(今回の例では8行目)において、他の行と異なる列数が見つかった場合に発生します。
例えば、以下のようなCSVがあったとします:
名前,年齢,性別
田中,28,男性
佐藤,35,女性
,,,, ←← 空白やカンマだけの不正行
鈴木,41,男性
このようなケースでは、3列を期待しているのに5列(カンマ4つ)を含む行が混ざっており、pandas側でパース(構文解析)できずに ParserError が発生します。
エラーの原因:空白行や余計な区切り記号(カンマ)
私が遭遇したケースでは、CSVファイルに余計な空白行やカンマだけの行が含まれていたことが原因でした。
特に、手作業で作成されたCSVファイルや、他ツールからエクスポートされたデータでは、このような行が入りやすくなります。
有効だった対処法:on_bad_lines='skip' を使う
pandasの read_csv() 関数には、不正な行をスキップするためのオプションがあります。
以下のように書くことで、エラーの原因となる行を無視して処理を続けることができます。
import pandas as pd
csv_file_path = 'sample.csv'
df = pd.read_csv(
csv_file_path,
encoding='shift_jis',
on_bad_lines='skip', # 不正行をスキップ
warn_bad_lines=True # スキップされた行を警告表示(※pandas 1.3 以前向け)
)
print(df)
パラメータ解説
on_bad_lines='skip'
→ 不正な構文の行(列数の不一致など)を無視して読み込みを継続します
※pandas 1.3.0以降で使用可能warn_bad_lines=True
→ スキップした行に関する警告を表示します
※このオプションはpandas 1.3以降では非推奨です。代わりにon_bad_lines='warn'を使用してください
その他の回避方法(状況に応じて)
もし on_bad_lines='skip' を使いたくない、あるいはエラーの原因を根本から取り除きたい場合には、以下のような方法もあります:
- 事前にCSVをテキストエディタなどで開き、空行や不正行を削除する
error_bad_lines=Falseを使う(古いバージョン用)csv.reader()を使って1行ずつ処理する(柔軟だがやや煩雑)
まとめ
ParserError: Expected X fields in line Y, saw Z は、CSVファイル内で列数が不一致な行があることが原因で発生するエラーです。
今回紹介した対処法:
on_bad_lines='skip'を指定することで不正な行をスキップwarn_bad_lines=Trueで警告を出す(旧バージョン)
このエラーは、CSVの構造や整形処理が正しくできていないときに頻発します。
業務用のデータ処理や自動化の中で遭遇することも多いため、覚えておくと安心です。
技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。
気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。
