csvモジュールを利用したcsvファイルへの書き込みと読み込みのやり方を完全解説!
目次 非表示
モジュールコンテンツ
CSVモジュールでは、CSV 形式で書かれたテーブル状のデータを読み書きするためのクラスを実装しています。
この記事ではCSVモジュールを詳しく説明していきます。
関数
csv.reader(csvfile,dialect='excel',**fmtparams)
与えられたcsvfile内の行を反復処理するような reader オブジェクトを返します。
コンストラクタcsv.reader()の第一引数にopen()で開いたファイルオブジェクトを指定する。csv.readerオブジェクトは行を反復処理するイテレータとみなせるため、for文で行ごとのデータを取得できる。
import csv
with open('sample.csv',newline='') as f:
    d = csv.reader(f,delimiter=' ',quotechar='|')
    for row in d:
        print(row)実行結果
['1,a']
['2,b']
['3,c']
['4,d']
['5,e']
['6,f']csv.writer(csvfile,dialect='excel',**fmtparams)
ユーザが与えたデータをデリミタで区切られた文字列に変換し、与えられたファイルオブジェクトに書き込むための writer オブジェクトを返します。
import csv
rows = [
    [8,"h"],
    [9,"i"],
    [10,"j"]
]
with open('sample.csv','w',newline='') as f:
    write = csv.writer(f,delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMAL)
    write.writerow([7,"g"])
    write.writerows(rows)7 g
8 h
9 i
10 jreader,writerのそれぞれの引数について
| 引数 | 説明 | 
|---|---|
| csvfile | ファイルオブジェクト | 
| dialect | 特定の CSV 表現形式 (dialect) 特有のパラメータの集合を定義。 | 
| **fmtparams | 現在の表現形式における個々の書式パラメータを上書きするために与えることができます。 | 
表現形式および書式化パラメータの詳細
| 属性 | 内容 | デフォルト | 
|---|---|---|
| delimiter | フィールド間を分割するのに使用する文字。 | , | 
| doublequote | 引用符インスタンスを2重にするかどうかの制御フラグ | True | 
| escapechar | エスケープシーケンスを表す文字 | None | 
| lineterminator | writer が使用する一行の終わりを表す文字列 | \r\n | 
| quotechar | 特別な値を含むフィールドを囲むための文字列(一文字) | “ | 
| quoring | クオートがいつ writer によって生成されるか、また reader によって認識されるかを制御します。 | OUTE_MINIMAL | 
| skipinitialspace | フィールド区切り文字の後のスペースを無視する | False | 
これを利用することでいろいろな表現形式を指定できる。
csv.get_dialect(name)
nameに関連づけられた表現形式を返します。
import csv
csv.register_dialect('pipes', delimiter='|')
l = csv.get_dialect('pipes')
print(l)<_csv.Dialect object at 0x000001F70FBCDEA0>csv.register_dialect(name[, dialect[, **fmtparams]])
dialect を name と関連付けます。
7|g
8|h
9|i
10|jこのように区切りが”|”であるとき、新しい dialect に delimiter を指定して登録できます。
import csv
csv.register_dialect('pipes', delimiter='|') #"|"をpipesというnameで登録
with open('sample.csv', 'r') as f:
    reader = csv.reader(f, dialect='pipes')
    for row in reader:
        print(row)“|”を区切り文字として認識してカンマ区切りのファイルのように祖見込まれます。
['7', 'g']
['8', 'h']
['9', 'i']
['10', 'j']csv.unregister_dialect(name)
nameに関連づけられた表現形式を表現形式レジストリから削除します。
import csv
csv.register_dialect('pipes', delimiter='|')
csv.unregister_dialect('pipes')
l = csv.get_dialect('pipes')
print(l)_csv.Error: unknown dialect登録したregisterを読み込もうとしたところエラーが起きたため削除できていることがわかる。
csv.list_dialects()
登録されている全ての表現形式を返します。
import csv
l = csv.list_dialects()
print(l)['excel', 'excel-tab', 'unix']csv.filed_size_limit([new_limit])
パーサが許容する現在の最大フィールドサイズを返します。
import csv
f = csv.field_size_limit()
print(f)131072クラス
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
通常のリーダーのように動作するが、各行の情報を、オプションのfieldnamesパラメーターによってキーが指定されるdictにマップするオブジェクトを作成します。
| 引数 | 内容 | 
|---|---|
| f | 開いたファイル | 
| fieldname | 辞書のkeyを設定。省略した場合、ファイル’f’の最初の行の値が使用される | 
| restkey | 行にフィールド名よりも多くフィールドがある場合、残りのデータはリストに入れられる。 その時のリストに対するフィールド名を指定。 | 
| restval | 行の値がフィールド名より少ないとき、欠落している値を設定。 | 
| dialect | readerと同様 | 
import csv
a = ["年","月"]
with open('sample.csv',newline='') as f:
    d = csv.DictReader(f,fieldnames=a,restkey="末日",dialect='excel')
    for row in d:
        print(row)
    print(d){'年': '2020', '月': '1', '末日': ['31']}
{'年': '2020', '月': '2', '末日': ['29']}
{'年': '2020', '月': '3', '末日': ['31']}
{'年': '2020', '月': '4', '末日': ['30']}
{'年': '2020', '月': '5', '末日': ['41']}csv.DictWiter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
通常の writer のように動作しますが、辞書を出力行にマップするオブジェクトを生成します。
| 引数 | 内容 | 
|---|---|
| f | 開いたファイル | 
| filednames | writerrow()メソッドに渡された辞書の値がどのような順でファイルに書かれるかを指定 | 
| restval | 行の値がフィールド名より少ないとき、欠落している値を設定。 | 
| exreasaction | fieldnamesに存在しないkeyが含まれている場合、どんな動作を行うか指定。デフォルト値ではValueErrorが創出される。 | 
| dialect | writerと同様 | 
import csv
with open('sample.csv','w',newline='') as f:
    fieldnames = ['月','年','末日']
    d = csv.DictWriter(f,fieldnames=fieldnames,restval='NoSet')
    d.writerow({'年':2020,'月':1})
    d.writerow({'年':2020,'月':2})
    d.writerow({'年':2020,'月':3})1,2020,NoSet
2,2020,NoSet
3,2020,NoSetcsv.Dialect
Dialect クラスはコンテナクラスで、基本的な用途としては、その属性を特定の reader や writer インスタンスのパラメータを定義するために用います。
csv.excel
excel クラスは Excel で生成される CSV ファイルの通常のプロパティを定義します。これは ‘excel’ という名前の dialect として登録されています。
csv.excel_tab
excel_tab クラスは Excel で生成されるタブ分割ファイルの通常のプロパティを定義します。これは ‘excel-tab’ という名前の dialect として登録されています。
csv.unix_dialect
unix_dialect クラスは UNIX システムで生成される CSV ファイルの通常のプロパティ (行終端記号として ‘\n’ を用い全てのフィールドをクォートするもの) を定義します。これは ‘unix’ という名前の dialect として登録されています。
csv.Sniffer
Sniffer クラスは CSV ファイルの書式を推理するために用いられるクラスです。
Snifferクラスではメソッドを二つ提供しています。
sniff(sample, delimiters=None)
与えられた sample を解析し、発見されたパラメータを反映した Dialect サブクラスを返します。オプションの delimiters パラメータを与えた場合、有効なデリミタ文字を含んでいるはずの文字列として解釈されます。
has_header(sample)
サンプルテキスト(CSV形式であると推定)を分析し、最初の行が列ヘッダーである場合はTrueを返します。
'7'|'g'
'8'|'h'
'9'|'i'
'10'|'j'
import csv
sniffer = csv.Sniffer()
sample_bytes = 32
with open('sample.csv','r',newline='') as f:
    dialect = sniffer.sniff(f.read(sample_bytes))
    head = sniffer.has_header(f.read(sample_bytes))
    print(dialect.delimiter)
    print(dialect.quotechar)
    print(head)|
'
True定数
csv.QUOTE_ALL
writer オブジェクトに対し、全てのフィールドをクオートするように指示します。
csv.QUOTE_MINIMAL
writer オブジェクトに対し、 delimiter 、 quotechar または lineterminator に含まれる任意の文字のような特別な文字を含むフィールドだけをクオートするように指示します。
csv.QUOTE_NONNUMERIC
writer オブジェクトに対し、全ての非数値フィールドをクオートするように指示します。
reader に対しては、クオートされていない全てのフィールドを float 型に変換するよう指示します。
csv.QUOTE_NONE
writer オブジェクトに対し、フィールドを決してクオートしないように指示します。
現在の delimiter が出力データ中に現れた場合、現在設定されている escapechar 文字が前に付けられます。
escapechar がセットされていない場合、エスケープが必要な文字に遭遇した writer は Error を送出します。
reader に対しては、クオート文字の特別扱いをしないように指示します。
例外
csv.Error
全ての関数において、エラーが検出された際に送出される例外です。
readerオブジェクト
csvreader.__next__()
reader の反復可能なオブジェクトから、現在の表現形式に基づいて次の行を解析してリストまたは辞書 として返します。
csvrader.dialect
パーサで使われる表現形式の読み出し専用の記述です。
csvreader.line_num
ソースイテレータから読み取られた行数。レコードは複数の行にまたがることができるため、これは返されるレコードの数と同じではありません。
csvreader.fieldnames (DictReaderオブジェクト)
オブジェクトを生成するときに渡されなかった場合、この属性は最初のアクセス時か、ファイルから最初のレコードを読み出したときに初期化されます。
import csv
with open('sample.csv','r',newline='') as f:
    r = csv.reader(f)
    n = r.__next__()
    d = r.dialect
    l = r.line_num
    print('next:',n)
    print('dialect:',d)
    print('line_num:',l)
    
    dr = csv.DictReader(f,fieldnames=['年','月','末日'])
    f = dr.fieldnames
    print('filedname:',f)next: ['2020', '1', '31']
dialect: <_csv.Dialect object at 0x00000290B64597E0>
line_num: 1
filedname: ['年', '月', '末日']writerオブジェクト
csvwriter.writerow(row)
現在の方言に従ってフォーマットされた行パラメーターをライターのファイルオブジェクトに書き込みます。
import csv
with open ('sample.csv','w',newline='') as f:
    w = csv.writer(f)
    w.writerow(['a','b','c'])a,b,ccsvwriter.writerows(rows)
rows引数の全ての要素を現在の表現形式に基づいて書式化し、writer のファイルオブジェクトに書き込みます。
import csv
with open ('sample.csv','w',newline='') as f:
    w = csv.writer(f)
    w.writerows([['a'],['b'],['c']])a
b
ccsvwriter.dialect
writer で使われる表現形式の読み出し専用の記述です。
import csv
with open ('sample.csv','w',newline='') as f:
    w = csv.writer(f,dialect='excel')
    print(w.dialect)<_csv.Dialect object at 0x0000024D4AF64FC0>DictWriter.writeheader() (DictWriterオブジェクト)
現在の方言に従ってフォーマットされた、(コンストラクターで指定された)フィールド名を含む行をライターのファイルオブジェクトに書き込みます。 内部で使用されるcsvwriter.writerow()呼び出しの戻り値を返します。
import csv
with open ('sample.csv','w',newline='') as f:
    w = csv.writer(f,dialect='excel')
    print(w.dialect)a,b,c