Python で CSVファイルを読み込む方法

Python の標準モジュールである csv モジュールを使った CSV データの読み込みを検証しました。

始めに通常の読み込みを行い、その後、読み込んだデータをディクショナリに格納します。

 

 

検討1: CSV ファイルを読み込む

 

1. 読み込み対象の CSVファイル

買い物リスト.csv

りんご,オレンジ,ぶどう
シャーペン,マジック

 

2. プログラム

import csv

# ファイルをオープンする
with open("買い物リスト.csv", encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)

# 参考までに type を表示
print(type(csv_reader))

# 読み込んだ内容を表示する
for row in csv_reader:
print(row)

 

 

出力結果

<class '_csv.reader'>
['りんご', 'オレンジ', 'ぶどう']
['シャーペン', 'マジック']

 

説明

csvモジュールを使って CSVファイルを読み込むためには、まず始めにファイルそのものを読み込む必要があります。

 

ファイルの読み込みには open を使います。そして、open をしている with 構文内で csv モジュールを使ってファイルの内容を CSV として読み込みます。

 

csv.reader() で読み込まれた内容は csv_class となります。内容を取り出すには、for 文を使います。

 

---

検討2: CSV の読み込みを関数にする

 

CSV を読み込むための関数を作成し、外部の処理へ読み込み結果を渡すようにしてみました。

 

・読み込み対象の CSVファイル: 買い物リスト

りんご,オレンジ,ぶどう
シャーペン,マジック

 

・プログラム

import csv


# CSVファイルを読み込む
def read_csv(file):
with open(file, encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)
content = []

for row in csv_reader:
content.append(row)

return content


if __name__ == "__main__":
# csv_readerクラスを受け取る
csv_data = read_csv("買い物リスト.csv")

# csv_readerクラスを確認
print(type(csv_data))

# csv_reader内容を表示
for row in csv_data:
print(row)

 

出力結果

<class 'list'>
['りんご', 'オレンジ', 'ぶどう']
['シャーペン', 'マジック']

 

 

---

検討3: CSV の読み込みを関数にする (失敗例)

 

実行例2 の前に思いついたのが、この方法です。CSV を読み込む関数から csv_reader クラスを返して、本体の処理で中身を取り出そうとしました。csv_readerクラスを渡すことはできるのですが、中身を表示しようとすると、既に閉じたファイルへのアクセスだということでエラーになります。

 

import csv


# CSVファイルを読み込む
def read_csv(file):
with open(file, encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)

return csv_reader


if __name__ == "__main__":
# csv_readerクラスを受け取る
csv_file = read_csv("買い物リスト.csv")

# csv_readerクラスを確認
print(type(csv_file))

# csv_reader内容を表示
for row in csv_file:
print(row)

 

表示されるエラーメッセージ

Traceback (most recent call last):
File "csv_sample.py", line 21, in <module>
for row in csv_file:
ValueError: I/O operation on closed file.
<class '_csv.reader'>

 

---

検討4: 読み取った CSV の内容をディクショナリにする

 

買い物リスト内容を修正し、1列目にその行に列挙されている品物の種類を表す分類列 を付与することにしました。それが後述の "買い物リスト2" です。

 

この分類列(今回の例では "くだもの"と"文房具")をキーにしたディクショナリを作成すれば、CSV を読み込んだ後、分類をキーにして特定行を呼び出すことができるようになります。

 

CSV データを出てきた順に処理するのであればリストで問題ないのですが、後から特定行だけを呼び出す場合、ディクショナリが便利だと思いました。

 

・読み込み対象の CSVファイル: 買い物リスト2

くだもの,りんご,オレンジ,ぶどう
文房具,シャーペン,マジック

 

・プログラム

import csv

# CSVファイルを読み込む
def read_csv(file):
with open(file, encoding="utf8") as f:
# CSV を読み込む
csv_reader = csv.reader(f)
content = {}

for row in csv_reader:
content[row[0]] = row[1:]

return content


# csv_readerクラスを受け取る
csv_data = read_csv("買い物リスト2.csv")

# csv_readerクラスを確認
print(type(csv_data))

# 内容の表示
# CSVデータ全て
print(csv_data)

# くだもの行の呼び出し
print(csv_data["くだもの"])

# くだもの行の特定列の呼び出し
print(csv_data["くだもの"][1])

 

・出力結果

<class 'dict'>
{'くだもの': ['りんご', 'オレンジ', 'ぶどう'], '文房具': ['シャーペン', 'マジック']}
['りんご', 'オレンジ', 'ぶどう']
オレンジ