PythonでCSVの行・列がずれる|改行とカンマを正しく読む

PythonでCSVの行・列がずれる|改行とカンマを正しく読む

記事
IT・テクノロジー
カテゴリ:Python

「CSVを読み込んだら、備考の途中から別の行になった」。Pythonで改行やカンマだけを頼りに分けているなら、読み方を確認しましょう。原本を残して試せます。

1.引用符の中にも改行がある

次は、番号と備考の2列、明細3件の例です。

番号,備考
001,"赤,青"
002,"午前
配達"
003,"型番""A"""

半角の引用符「"」で囲んだ部分は1項目です。002の備考には改行が含まれ、003の備考は「型番"A"」になります。

ところが、splitlines()で分けると明細が4行になり、split(",")では「赤,青」も別の列になります。見た目の改行数と、CSVの件数は同じとは限りません。

02_before_real.png
2.csv.readerで元ファイルを読む

Python 3でCSVを読む処理がある方向けです。次はUTF-8のカンマ区切り・見出し1行の小さなCSV用。追加ライブラリは不要です。

実行するフォルダに元CSVのコピーをinput.csvとして置き、次をread_csv.pyに保存して実行します。既存処理に組み込む前に、読むだけで確認します。

import csv
with open("input.csv", encoding="utf-8-sig", newline="") as f: rows = list(csv.reader(f, strict=True))
print("明細件数:", len(rows) - 1)
print(rows[1:])

newline=""で改行処理をcsv側に任せます。utf-8-sigはBOM付きUTF-8にも対応します。文字コードや区切りが違うCSVは、出力元の仕様を確認します。listは全件をメモリーに載せるため、大容量ファイルは対象外です。

3.件数だけでなく中身も確認

Linux・Python 3.12の実測では明細3件に戻り、001・002・003の先頭0、「赤,青」、備考内の改行、引用符が残りました。表示中の\r\nは、改行を表す記号です。読み取りだけなので、元のCSVは変わりません。

03_after_real.png
引用符が閉じていないなど、入力に問題があるとstrict=Trueでエラーになる場合があります。これは自動修復ではありません。引用符や改行を一括削除せず、出力元でCSVを作り直してください。

うまく直らない場合は、お気軽にご相談ください。

プロフィールはこちら


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す