csv.reader() / csv.writer()
| 対応: | Python 2(2000) |
|---|
CSVファイルの読み書きを行う『csv』モジュールの関数です。スプレッドシートや表形式のデータを処理するときに使います。
構文
import csv
# CSVファイルを読み込む
with open('data.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row) # 各行がリストとして取得できる
# CSVファイルに書き込む
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(['名前', '年齢', '都市'])
writer.writerows([['綾波レイ', 14, 'NERV'], ['碇シンジ', 14, 'NERV']])
関数一覧
| 関数 | 概要 |
|---|---|
| csv.reader(f) | CSVファイルオブジェクトを受け取り、各行をリストとして返すイテレータを生成します。 |
| csv.writer(f) | CSVファイルオブジェクトを受け取り、CSVに書き込むためのライターオブジェクトを返します。 |
| writer.writerow(行) | 1行分のリストをCSV形式でファイルに書き込みます。 |
| writer.writerows(行リスト) | 複数行のリスト(リストのリスト)をまとめて書き込みます。 |
| csv.DictReader(f) | 1行目をヘッダー行として読み取り、各行を辞書として返すイテレータを生成します。 |
| csv.DictWriter(f, fieldnames) | 辞書形式でCSVに書き込むためのライターオブジェクトを返します。 |
| writer.writeheader() | DictWriterでヘッダー行(フィールド名)を書き込みます。 |
サンプルコード
csv_reader_writer.py
import csv
# csv.writer() でCSVファイルを作成する
rows = [
['名前', '年齢', '所属'],
['綾波レイ', 14, 'NERV'],
['碇シンジ', 14, 'NERV'],
['惣流アスカ', 14, 'NERV'],
]
with open('users.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(rows)
# csv.reader() でCSVファイルを読み込む
with open('users.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
header = next(reader) # ヘッダー行を取得する
print(f'ヘッダー: {header}')
for row in reader:
print(row) # 各行がリストとして出力される
# DictWriter で辞書形式で書き込む
users = [
{'name': '綾波レイ', 'age': 14, 'org': 'NERV', 'email': 'ayanami_rei@wp-p.info'},
{'name': '碇シンジ', 'age': 14, 'org': 'NERV', 'email': 'ikari_shinji@wp-p.info'},
]
with open('users2.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'age', 'org', 'email'])
writer.writeheader()
writer.writerows(users)
# DictReader で辞書形式で読み込む
with open('users2.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
for row in reader:
print(f"{row['name']}さん、{row['org']}所属、メール: {row['email']}")
# 例: 『綾波レイさん、NERV所属、メール: ayanami_rei@wp-p.info』と出力される
# タブ区切り(TSV)ファイルに書き込む場合はdelimiterを指定する
with open('data.tsv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f, delimiter='\t')
writer.writerow(['A', 'B', 'C'])
実行すると次のように出力されます。
python3 csv_reader_writer.py ヘッダー: ['名前', '年齢', '所属'] ['綾波レイ', '14', 'NERV'] ['碇シンジ', '14', 'NERV'] ['惣流アスカ', '14', 'NERV'] 綾波レイさん、NERV所属、メール: ayanami_rei@wp-p.info 碇シンジさん、NERV所属、メール: ikari_shinji@wp-p.info
概要
CSVファイルを開く際は『newline=""』を指定することが重要です。これを省略すると改行コードの扱いが環境によって変わり、Windowsで二重改行が入るなどの問題が発生します。
『csv.DictReader』を使うとヘッダー行をキーとした辞書で各行にアクセスできるため、列の順序を意識せずにデータを扱えます。大量のデータを処理する場合でもイテレータ形式のためメモリ効率が良いです。
Windowsで作成されたCSVファイルは文字コードが Shift-JIS(cp932)になっていることがあります。『encoding="utf-8"』で読み込むと文字化けするため、ファイルのエンコードに合わせて指定します。
よくあるミス
よくあるミス1: newline=''を指定しないと空行が入る
Windows環境でCSVを書き込む際、『newline=""』を指定しないと改行が二重になり、行間に空白行が入ります。
import csv
# newline='' を指定しないと空行が入ることがある(特にWindows)
with open('nerv_members.csv', 'w') as f: # newline指定なし
writer = csv.writer(f)
writer.writerows([['綾波レイ', 'NERV'], ['碇シンジ', 'NERV']])
次のように記述します。
import csv
# newline='' を指定する
with open('nerv_members.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows([['綾波レイ', 'NERV'], ['碇シンジ', 'NERV']])
よくあるミス2: encoding指定なしで文字化け
日本語を含むCSVではencodingを明示します。Excelで開く場合は『utf-8-sig』(BOM付きUTF-8)を使うと文字化けを防ぎやすくなります。
import csv
# encoding未指定(環境依存)
with open('members.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['名前', '所属']) # 環境によって文字化けする
次のように記述します。
import csv
# encoding を明示する
with open('members_utf8.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['名前', '所属'])
writer.writerow(['綾波レイ', 'NERV'])
# Excel で開く場合は utf-8-sig(BOM付き)
with open('members_excel.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['名前', '所属'])
writer.writerow(['碇シンジ', 'NERV'])
よくあるミス3: ヘッダー行を読み飛ばし忘れる
通常の『csv.reader』はヘッダー行も1行目として読み込みます。ヘッダーをスキップしたい場合は『next()』で先読みするか、『csv.DictReader』を使います。
CSVファイルの内容:
名前,所属,年齢 綾波レイ,NERV,14 碇シンジ,NERV,14
次のように記述します。
import csv
# ヘッダー行もデータとして処理してしまう
with open('members.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row[0]) # 最初に '名前' が出力されてしまう
次のように記述します。
import csv
# next() でヘッダーをスキップ
with open('members.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
next(reader) # ヘッダーを読み飛ばす
for row in reader:
print(row[0]) # 綾波レイ, 碇シンジ
# DictReader を使うとヘッダーが自動的にキーになる
with open('members.csv', newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['名前'], row['所属'])
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。