アイキャッチ画像

PythonでいろいろなCSVデータを読み込んでみた

PythonでいろいろなCSVデータを読み込んでみました。はたして意図通りに読み込めたでしょうか。

目次

  1. 読み込みテストに使用するスクリプト
  2. 文字の種類とデータの型がどうなるのか確認する
  3. 区切り文字の前後のスペースの解釈
  4. エスケープの解釈
  5. フィールドの数を確認しているか

読み込みテストに使用するスクリプト

テスト用のCSVデータはtest.csvというファイル名で保存します。実行環境はWindows10ですが、データの文字コードはUTF-8で改行コードはLFです。

スクリプトはこのようにしました。

import csv

with open('test.csv', mode='r', newline='', encoding='utf-8') as f:
    csv_reader = csv.reader(f)
    read_data = [row for row in csv_reader]

print(read_data)

ファイルから読み込んで、読み込んだデータを表示するだけのスクリプトです。

文字の種類とデータの型がどうなるのか確認する

まずはどのような型で読み込まれるのか見てみます。

test.csv  # 入力
Alphabet,かな,0123,0.123

# 出力
[['Alphabet', 'かな', '0123', '0.123']]

数字はすべて文字列として読み込まれました。数字として使用する際には型変換が必要ですね。

区切り文字の前後のスペースの解釈

区切り文字前後にスペースを入れてみました。特にログファイルなどで数字とカンマの間にスペースを入れたりすることは多いのではないでしょうか。

test.csv  # 入力
"いろは", "いろは" ,いろは, いろは ,123, 123

# 出力
[['いろは', ' "いろは" ', 'いろは', ' いろは ', '123', ' 123 ']]

区切り文字前後のスペースもデータの一部として扱われます。CSVの厳密なルールはそうなってます。

ダブルクォーテーションで括っても、その外側のスペースもデータ扱いになってますね。

データとして扱う際に注意が必要です。

エスケープの解釈

ダブルクォーテーションによるエスケープを試してみます。

test.csv  # 入力
いろは  にほへと,"いろは,にほへと","いろは
にほへと"

# 出力
[['いろは\tにほへと', 'いろは,にほへと', 'いろは\nにほへと']]

一番目のフィールドには、「いろは」と「にほへと」の間にタブが入っています。基準値では区切り文字がカンマになりますので、タブは文字として認識されました。

二番目のフィールドには、「いろは」と「にほへと」の間にカンマが入っています。ダブルクォーテーションでエスケープされているので、このカンマは区切りではない文字として認識されました。

三番目のフィールドには、「いろは」と「にほへと」の間に改行が入っています。ダブルクォーテーションによるエスケープがなければ改行はレコードの区切りになるのですが、改行文字として認識されました。

フィールドの数を確認しているか

レコードによってフィールドの数が異なっていたらどうなるのでしょうか。

test.csv  # 入力
A1,B1,C1
A2,B2
A3,B3,C3,D3

# 出力  見やすいように成形しました。
[
['A1', 'B1', 'C1'],
['A2', 'B2'],
['A3', 'B3', 'C3', 'D3']
]

フィールドの数が増減してもエラーにはならないし、数を合わせてもくれないのですね。 1行ずつ読み出してるからでしょうか。

リストの長さがあっているかどうかの確認が必要ですね。

広告

PythonでCSVカテゴリの投稿