CSV をリストで扱う
CSV ファイル読み込み
ファイルを open()
で開いて、csv.reader()
で読み込む。
読み込み後の各要素は文字列 str
となる。
import csv
# 読み込む CSV
'''
11,12,13,14
21,22,23,24
31,32,33,34
'''
with open('./sample.csv') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# ['11', '12', '13', '14']
# ['21', '22', '23', '24']
# ['31', '32', '33', '34']
CSV ファイルを出力
ファイルを open()
で開いて、csv.writer()
で writer を取得する。
writerow()
に書き込む値のリストを渡して書き込む。
import csv
with open('./sample.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow([11, 12, 13])
writer.writerow([21, 22, 23])
writer.writerow([31, 32, 33])
# 出力される CSV
'''
11,12,13
21,22,23
31,32,33
'''
csv.reader(), csv.writer() の各引数
引数名 | 説明 | デフォルト値 |
---|---|---|
delimiter | フィールドの区切り文字。 | ',' (カンマ) |
doublequote | フィールド内の quotechar を自身でエスケープするかエスケープ文字でエスケープするか。 True : 自身でエスケープ (quotechar が " ならば "")。 False : escapechar でエスケープ (quotechar が ", escapechar が \ ならば ")。 |
True |
escapechar | エスケープ文字。 これに続く特殊文字をただの文字として扱う。 |
None |
quotechar | delimiter や quotechar といった特殊文字や改行文字を含むフィールドを囲む際に用いられる 1 文字。 | '"' (ダブルクォーテーション) |
skipinitialspace | True の場合、delimiter の直後の空白は無視される。 | False |
lineterminator | writer で CSV を出力する際の行終端文字。 ver 3.9.2 では readerの場合は無視される (変更される可能性あり)。 |
\r\n |
strict | True の場合、不正な CSV 入力に対して Error を出す。 | False |
quoting | クォートが writer によって生成、reader によって認識されるタイミングを指定。 QUOTE_* 定数のいずれかをとる。 |
QUOTE_MINIMAL |
CSV を辞書で扱う
CSV ファイル読み込み
ファイルを open()
で開いて、csv.DictReader()
で key にフィールド名、value にファイルから読み込んだ値を持つ辞書として読み込む。
fieldnames オプションを指定しなかった場合、ファイル 1 行目をフィールド名として扱う。
import csv
#読み込む CSV
'''
first_name,last_name
Eric,Idle
John,Cleese
'''
with open('./sample.csv') as f:
reader = csv.DictReader(f)
for row in reader:
print(row)
# {'first_name': 'Eric', 'last_name': 'Idle'}
# {'first_name': 'John', 'last_name': 'Cleese'}
CSV ファイルを出力
ファイルを open()
で開いて、csv.DictWriter()
で writer を取得する。
writeheader()
でフィールド名を、writerow()
に辞書を渡して値を書き込む。
書き込み先のカラムを指定する必要があるため DictReader()
と異なり fieldnames を省略することはできない。
import csv
with open('./sample.csv', 'w') as f:
names = ['first_name', 'last_name']
writer = csv.DictWriter(f, fieldnames=names)
writer.writeheader() # names (= fieldnames に指定したリスト) を出力
writer.writerow({'first_name': 'Eric', 'last_name': 'Idle'})
writer.writerow({'first_name': 'John', 'last_name': 'Cleese'})
#出力される CSV
'''
first_name,last_name
Eric,Idle
John,Cleese
'''
csv.DictReader(), csv.DictWriter() の各引数
それぞれ reader()、writer() をベースにしているため各引数はそのまま利用可能。
DictReader(), DictWriter() 固有の引数は以下。
引数名 | 説明 | デフォルト値 |
---|---|---|
fieldnames | CSV のフィールド名。 sequenceで指定し、指定しなかった場合は 1 行目の値をフィールド名として使用する。 DictWriter は省略不可。 |
None |
restkey | DictReader のみのオプション。 読み込んだ行に fieldnames よりも多くのフィールドが存在した場合、残りの値をリストにして restkey で指定した名前で保存する。 |
None |
restval | 空白行以外の行でフィールド数が fieldnames よりも少なかった場合、欠落している値は restval となる。 | DictReader:None DictWriter:'' |
extrasaction | DictWriter のみのオプション。 writerow() に渡された辞書に fieldnames で定義されていないフィールドが存在した場合の動作を決定する。 raise (デフォルト):ValueError が送出される。 ignore:無視される。 |
raise |