【python】CSVファイルの読み書き

スポンサーリンク
プログラミング

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 j

reader,writerのそれぞれの引数について

引数説明
csvfileファイルオブジェクト
dialect特定の CSV 表現形式 (dialect) 特有のパラメータの集合を定義。
**fmtparams現在の表現形式における個々の書式パラメータを上書きするために与えることができます。

表現形式および書式化パラメータの詳細

属性内容デフォルト
delimiterフィールド間を分割するのに使用する文字。,
doublequote引用符インスタンスを2重にするかどうかの制御フラグTrue
escapecharエスケープシーケンスを表す文字None
lineterminatorwriter が使用する一行の終わりを表す文字列\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(ffieldnames=Nonerestkey=Nonerestval=Nonedialect='excel'*args**kwds)

通常のリーダーのように動作するが、各行の情報を、オプションのfieldnamesパラメーターによってキーが指定されるdictにマップするオブジェクトを作成します。

引数内容
f開いたファイル
fieldname辞書のkeyを設定。省略した場合、ファイル’f’の最初の行の値が使用される
restkey行にフィールド名よりも多くフィールドがある場合、残りのデータはリストに入れられる。
その時のリストに対するフィールド名を指定。
restval行の値がフィールド名より少ないとき、欠落している値を設定。
dialectreaderと同様
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(ffieldnamesrestval=''extrasaction='raise'dialect='excel'*args**kwds

通常の writer のように動作しますが、辞書を出力行にマップするオブジェクトを生成します。

引数内容
f開いたファイル
filednameswriterrow()メソッドに渡された辞書の値がどのような順でファイルに書かれるかを指定
restval行の値がフィールド名より少ないとき、欠落している値を設定。
exreasactionfieldnamesに存在しないkeyが含まれている場合、どんな動作を行うか指定。デフォルト値ではValueErrorが創出される。
dialectwriterと同様
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,NoSet

csv.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(sampledelimiters=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,c
csvwriter.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
c
csvwriter.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

コメント

タイトルとURLをコピーしました