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