【Python】ParserError: Error tokenizing data. C error: Expected 1 fields in line 8, saw 2 の原因と対処法

目次

実行環境

  • MacBook Air (11-inch, Early 2015)
  • macOS バージョン 11.6(20G165)
  • Python 3.8.8(64-bit)

エラー発生の経緯

Pythonのpandasライブラリを使ってCSVファイルを読み込み、
条件抽出を行おうとした際に、以下のエラーが発生しました。

ParserError: Error tokenizing data. C error: Expected 1 fields in line 8, saw 2

このエラーが出たため、正しくデータを読み込めずに処理が止まってしまいました。

実際に実行したコマンド

diff = pd.read_csv(diff_files[0], encoding='shift-jis', header=None, dtype=object)

ここで、エラーが発生しました。

エラーの原因

調べたところ、このエラーは、

  • CSVファイル内のカラム数(列数)が、各行で揃っていない

ことが原因で発生するものでした。

具体的には、ファイルの冒頭行では1列しか存在していないと認識されているのに、
8行目で突然2列のデータが出現したため、整合性が取れずエラーが発生したという状況です。

対処方法

CSVファイルの列数が一定でない場合、pandasのread_csv()関数で
あらかじめカラム名(列名)を定義することで対応できると分かりました。

そこで、以下のようにカラム名を自動生成しました。

col_names = ['c{0:02d}'.format(i) for i in range(18)]  # ※18は列数です

これで、c00, c01, …, c17 という18個のカラム名が自動生成されます。

次に、read_csv()を次のように修正しました。

diff = pd.read_csv(diff_files[0], names=col_names, encoding='shift-jis', header=None, dtype=object)

ここで、

  • names=col_names を指定することで、ファイルの列構成に合わせる
  • header=None を指定することで、ファイル冒頭行をデータ行として読み込む

設定にしています。

これで、エラーが発生せず無事にデータを読み込むことができました。

結果

無事、エラーが消えました!

本当に嬉しかったです。

まとめ|ParserError対策は「カラム数の整合性を保つ」こと

今回の経験から分かったことは、

  • CSVファイル内の列数は、常に整合性を保つことが大事
  • カラム数が不揃いな場合は、namesオプションでカラム名を指定する

という基本的な注意点です。

特に、データの整形前や外部データを取り込む際は、
事前に列数の確認ファイル内容のチェックを怠らないことが大切だと実感しました。

今後もpandasを使う際には、ファイル構造に注意しながら処理を進めたいと思います。

技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。

プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。

気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。

[Kindle Unlimited 読み放題プランをチェックする]

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次