pythonの標準ライブラリでCSVを扱う

# CSV をリストで扱う
## CSV ファイル読み込み

ファイルを `open()` で開いて、`csv.reader()` で読み込む。
読み込み後の各要素は文字列 `str` となる。

```Python
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()` に書き込む値のリストを渡して書き込む。

```Python
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 を自身でエスケープするかエスケープ文字でエスケープするか。<br>　True : 自身でエスケープ (quotechar が " ならば "")。<br>　False : escapechar  でエスケープ (quotechar が ", escapechar が \ ならば \")。|True|
|escapechar|エスケープ文字。<br>これに続く特殊文字をただの文字として扱う。|None|
|quotechar|delimiter や quotechar といった特殊文字や改行文字を含むフィールドを囲む際に用いられる 1 文字。|'"' (ダブルクォーテーション)|
|skipinitialspace|True の場合、delimiter の直後の空白は無視される。|False|
|lineterminator|writer で CSV を出力する際の行終端文字。<br>ver 3.9.2 では readerの場合は無視される ([変更される可能性あり](https://docs.python.org/ja/3/library/csv.html#csv.Dialect.lineterminator))。|\r\n|
|strict|True の場合、不正な CSV 入力に対して Error を出す。|False|
|quoting|クォートが writer によって生成、reader によって認識されるタイミングを指定。<br>[QUOTE_* 定数のいずれか](https://docs.python.org/ja/3/library/csv.html#csv.QUOTE_ALL)をとる。|QUOTE_MINIMAL|

# CSV を辞書で扱う
## CSV ファイル読み込み

ファイルを `open()` で開いて、`csv.DictReader()` で key にフィールド名、value にファイルから読み込んだ値を持つ辞書として読み込む。
fieldnames オプションを指定しなかった場合、ファイル 1 行目をフィールド名として扱う。

```Python
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 を省略することはできない。

```Python
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 のフィールド名。<br>[sequence](https://docs.python.org/ja/3/library/collections.abc.html#module-collections.abc)で指定し、指定しなかった場合は 1 行目の値をフィールド名として使用する。<br>DictWriter は省略不可。|None|
|restkey|DictReader のみのオプション。<br>読み込んだ行に fieldnames よりも多くのフィールドが存在した場合、残りの値をリストにして restkey で指定した名前で保存する。|None|
|restval|空白行以外の行でフィールド数が fieldnames よりも少なかった場合、欠落している値は restval となる。|DictReader：None<br>DictWriter：''|
|extrasaction|DictWriter のみのオプション。<br>writerow() に渡された辞書に fieldnames で定義されていないフィールドが存在した場合の動作を決定する。<br>　raise (デフォルト)：[ValueError](https://docs.python.org/ja/3/library/exceptions.html#ValueError) が送出される。<br>　ignore：無視される。|raise|