TL;DR
csv モジュールは、CSV ファイルを読み込みパースする標準ライブラリである。csv モジュールを使うと CSV ファイルの読み込みや書き出し、追記ができる。
csv モジュールのポイント
- csv.reader クラスは、CSV ファイルの読み込みを行う
- csv.writer クラスは、CSV ファイルの書き込みを行う
- for 文の前に next()を入れるとヘッダを読み飛ばすことができる
- リスト内包表記が使える
- DictReader()クラスは、辞書のリストを作る
- ライブラリ Pandas を使っても、CSV の読み出しができる
CSV ファイルを作る
csv.writer クラスは、CSV ファイルの書き込みを行う。余分な改行コードを防ぐために、open 時に newline='' を指定する。
import csv
sns = [
['名称', '色'],
['twitter', 'red'],
['instagram', 'pink']
]
with open('sns.csv', 'w', newline='') as f:
c = csv.writer(f)
c.writerows(sns)
以下のような表が生成された。
名称 | 色 |
---|---|
red | |
pink |
newline='' については、csv --- CSV ファイルの読み書き — Python 3.10.0b2 ドキュメントにおいて次のように書かれている。
newline='' が指定されない場合、クォートされたフィールド内の改行は適切に解釈されず、書き込み時に \r\n を行末に用いる処理系では余分な \r が追加されてしまいます。csv モジュールは独自 (universal) の改行処理を行うため、newline='' を指定することは常に安全です。
※ open 関数を使うと、指定したファイルを開き、ファイルを読み書きするためのオブジェクトを得ることができる。open 関数は with 文と合わせて使い、as の後方の変数にファイルオブジェクトが格納される。
CSV ファイルに追記する
次に、writerows()を使い、先程作成した sns.csv に追記した。
import csv
add = [
['名称', '色'],
['twitter', 'blue'],
['instagram', 'pink'],
['facebook', 'darkblue']
]
with open('sns.csv', 'w', newline='') as f:
w = csv.writer(f)
w.writerows(add)
以下のような表に変更された。
名称 | 色 |
---|---|
blue | |
pink | |
darkblue |
CSV ファイルを読み込む
sns.csv を読み込んでみよう。csv.reader クラスは、CSV ファイルの読み込みを行う。デフォルトだと、列はカンマ、行は\n
で分割される。
import csv
with open('sns.csv', newline='') as f:
c = csv.reader(f)
for i in c:
print(i)
# ['名称', '色']
# ['twitter', 'blue']
# ['instagram', 'pink']
# ['facebook', 'darkblue']
ヘッダを読み飛ばす
csv ファイルのヘッダを読み飛ばしたい場合は、for 文の前に、next()を入れる。
import csv
with open('sns.csv', newline='') as f:
c = csv.reader(f)
header = next(c) # ヘッダを読み飛ばす
for i in c:
print(i)
# ['twitter', 'blue']
# ['instagram', 'pink']
# ['facebook', 'darkblue']
リスト内包表記
リスト内包表記を使ってデータを表示することもできる。for 文で抽出できる行を作ってくれる。
import csv
with open('sns.csv', 'r', newline='') as f:
c = csv.reader(f)
g = [i for i in c]
print(g)
# [['名称', '色'], ['twitter', 'blue'], ['instagram', 'pink'], ['facebook', 'darkblue']]
DictReader()
DictReader() クラスを使うと辞書のリストにすることができる。
import csv
with open('sns.csv', 'r', newline='') as f:
c = csv.DictReader(f, fieldnames=['first', 'last'])
g = [i for i in c]
print(g)
# [OrderedDict([('first', '名称'), ('last', '色')]), OrderedDict([('first', 'twitter'), ('last', 'blue')]), OrderedDict([('first', 'instagram'), ('last', 'pink')]), OrderedDict([('first', 'facebook'), ('last', 'darkblue')])]
DictWriter()
DictWriter() クラスを使って、CSV ファイルを作る。writeheader() を呼び出し、CSV ファイルの先頭に名前を書き込む。
import csv
namelist = [
{'first' : 'yamada', 'last' : 'taro'},
{'first' : 'sato', 'last' : 'hanako'},
{'first' : 'yoshida', 'last' : 'ziro'}
]
with open('namelist.csv', 'w') as f:
c = csv.DictWriter(f, ['first', 'last'])
c.writeheader()
c.writerows(namelist)
namelist.csv というファイル名の CSV ファイルが生成される。中身は以下のようになる。
first | last |
---|---|
yamada | taro |
sato | hanako |
yoshida | ziro |
Pandas
構造化データのためのライブラリ Pandas を使って CSV の読み出しができる。
import pandas
date = pandas.read_csv('namelist.csv')
print(date)
# first last
# 0 yamada taro
# 1 sato hanako
# 2 yoshida ziro