Python: csv モジュールの使い方(reader、writer、DictReader など)

TwitterFacebookHatena
  • 公開:2021-11-18
  • 更新:2023-10-26
  • 文章量:3250
  • Python

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)

以下のような表が生成された。

名称
twitter red
instagram pink

newline='' については、csv --- CSV ファイルの読み書き — Python 3.10.0b2 ドキュメントにおいて次のように書かれている。

newline='' が指定されない場合、クォートされたフィールド内の改行は適切に解釈されず、書き込み時に \r\n を行末に用いる処理系では余分な \r が追加されてしまいます。csv モジュールは独自 (universal) の改行処理を行うため、newline='' を指定することは常に安全です。

※ open 関数を使うと、指定したファイルを開き、ファイルを読み書きするためのオブジェクトを得ることができる。open 関数は with 文と合わせて使い、as の後方の変数にファイルオブジェクトが格納される。

参考:コンテキストマネージャ with 文

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)

以下のような表に変更された。

名称
twitter blue
instagram pink
facebook 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

Python: csv モジュールの使い方(reader、writer、DictReader など)