csv —CSVファイルの読み取りと書き込み
ソースコード: :source: `Lib / csv.py`
いわゆるCSV(コンマ区切り値)形式は、スプレッドシートおよびデータベースの最も一般的なインポートおよびエクスポート形式です。 CSV形式は、 RFC 4180 で標準化された方法で形式を記述しようとする前に、長年使用されていました。 明確に定義された標準がないということは、さまざまなアプリケーションによって生成および消費されるデータに微妙な違いが存在することが多いことを意味します。 これらの違いにより、複数のソースからのCSVファイルを処理するのが面倒になる可能性があります。 それでも、区切り文字と引用文字は異なりますが、全体的な形式は十分に類似しているため、そのようなデータを効率的に操作できる単一のモジュールを記述して、プログラマーからのデータの読み取りと書き込みの詳細を隠すことができます。
csv モジュールは、CSV形式で表形式のデータを読み書きするためのクラスを実装します。 これにより、プログラマーは、Excelで使用されるCSV形式の正確な詳細を知らなくても、「このデータをExcelで推奨される形式で書き込む」または「Excelで生成されたこのファイルからデータを読み取る」と言うことができます。 プログラマーは、他のアプリケーションが理解できるCSV形式を記述したり、独自の専用CSV形式を定義したりすることもできます。
csv モジュールの reader および writer オブジェクトは、シーケンスの読み取りと書き込みを行います。 プログラマーは、 DictReader および DictWriter クラスを使用して、辞書形式でデータを読み書きすることもできます。
モジュールの内容
csv モジュールは、次の関数を定義します。
- csv.reader(csvfile, dialect='excel', **fmtparams)
指定された csvfile の行を反復処理するリーダーオブジェクトを返します。 csvfile は、 iterator プロトコルをサポートし、
__next__()
メソッドが呼び出されるたびに文字列を返す任意のオブジェクトにすることができます— ファイルオブジェクトおよびリストオブジェクトどちらも適しています。 csvfile がファイルオブジェクトの場合は、newline=
で開く必要があります。 1 オプションの dialect パラメーターを指定できます。これは、特定のCSV方言に固有のパラメーターのセットを定義するために使用されます。 これは、 Dialect クラスのサブクラスのインスタンス、または list_dialects()関数によって返される文字列の1つである可能性があります。 他のオプションの fmtparams キーワード引数を指定して、現在の方言の個々のフォーマットパラメーターをオーバーライドできます。 方言とフォーマットパラメータの詳細については、セクション方言とフォーマットパラメータを参照してください。csvファイルから読み取られた各行は、文字列のリストとして返されます。
QUOTE_NONNUMERIC
形式オプションが指定されていない限り、自動データ型変換は実行されません(この場合、引用符で囲まれていないフィールドは浮動小数点数に変換されます)。簡単な使用例:
>>> import csv >>> with open('eggs.csv', newline='') as csvfile: ... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') ... for row in spamreader: ... print(', '.join(row)) Spam, Spam, Spam, Spam, Spam, Baked Beans Spam, Lovely Spam, Wonderful Spam
- csv.writer(csvfile, dialect='excel', **fmtparams)
指定されたファイルのようなオブジェクトで、ユーザーのデータを区切り文字列に変換するライターオブジェクトを返します。 csvfile は、
write()
メソッドを持つ任意のオブジェクトにすることができます。 csvfile がファイルオブジェクトの場合は、newline=
1 で開く必要があります。 オプションの dialect パラメーターを指定できます。これは、特定のCSV方言に固有のパラメーターのセットを定義するために使用されます。 これは、 Dialect クラスのサブクラスのインスタンス、または list_dialects()関数によって返される文字列の1つである可能性があります。 他のオプションの fmtparams キーワード引数を指定して、現在の方言の個々のフォーマットパラメーターをオーバーライドできます。 方言とフォーマットパラメータの詳細については、方言とフォーマットパラメータセクションを参照してください。 DB APIを実装するモジュールとのインターフェースをできるだけ簡単にするために、値 None は空の文字列として書き込まれます。 これは可逆的な変換ではありませんが、cursor.fetch*
呼び出しから返されたデータを前処理せずに、SQLNULLデータ値をCSVファイルにダンプするのが簡単になります。 他のすべての非文字列データは、書き込まれる前に str()で文字列化されます。簡単な使用例:
import csv with open('eggs.csv', 'w', newline='') as csvfile: spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
- csv.register_dialect(name[, dialect[, **fmtparams]])
- 方言を名前に関連付けます。 name は文字列である必要があります。 方言は、 Dialect のサブクラスを渡すか、 fmtparams キーワード引数、またはその両方で指定できます。キーワード引数は、方言のパラメーターをオーバーライドします。 方言とフォーマットパラメータの詳細については、セクション方言とフォーマットパラメータを参照してください。
- csv.unregister_dialect(name)
- name に関連付けられている方言を方言レジストリから削除します。 name が登録された方言名でない場合、 Error が発生します。
- csv.list_dialects()
- 登録されているすべての方言の名前を返します。
- csv.field_size_limit([new_limit])
- パーサーで許可されている現在の最大フィールドサイズを返します。 new_limit が指定されている場合、これが新しい制限になります。
csv モジュールは、次のクラスを定義します。
- class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
通常のリーダーのように動作するが、各行の情報をオプションの fieldnames パラメーターによってキーが指定される dict にマップするオブジェクトを作成します。
fieldnames パラメーターは sequence です。 fieldnames を省略すると、ファイル f の最初の行の値がフィールド名として使用されます。 フィールド名の決定方法に関係なく、ディクショナリは元の順序を保持します。
行にフィールド名よりも多くのフィールドがある場合、残りのデータはリストに入れられ、 restkey (デフォルトは
None
)で指定されたフィールド名で保存されます。 空白以外の行のフィールドがフィールド名よりも少ない場合、欠落している値は restval の値(デフォルトはNone
)で埋められます。他のすべてのオプション引数またはキーワード引数は、基になる reader インスタンスに渡されます。
バージョン3.6で変更:返される行のタイプは
OrderedDict
になりました。バージョン3.8で変更:返される行のタイプは dict になりました。
簡単な使用例:
>>> import csv >>> with open('names.csv', newline='') as csvfile: ... reader = csv.DictReader(csvfile) ... for row in reader: ... print(row['first_name'], row['last_name']) ... Eric Idle John Cleese >>> print(row) {'first_name': 'John', 'last_name': 'Cleese'}
- class csv.DictWriter(f, fieldnames, restval=, extrasaction='raise', dialect='excel', *args, **kwds)
通常のライターのように動作するが、辞書を出力行にマップするオブジェクトを作成します。 fieldnames パラメーターは、
writerow()
メソッドに渡されたディクショナリ内の値がファイル f に書き込まれる順序を識別するキーのシーケンスです。 ]。 オプションの restval パラメーターは、辞書に fieldnames のキーがない場合に書き込まれる値を指定します。writerow()
メソッドに渡されたディクショナリにフィールド名にないキーが含まれている場合、オプションの extrasaction パラメータは実行するアクションを示します。 デフォルト値である'raise'
に設定されている場合、 ValueError が発生します。'ignore'
に設定されている場合、ディクショナリ内の余分な値は無視されます。 その他のオプションまたはキーワード引数は、基になる writer インスタンスに渡されます。DictReader クラスとは異なり、 DictWriter クラスの fieldnames パラメーターはオプションではないことに注意してください。
簡単な使用例:
import csv with open('names.csv', 'w', newline='') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
- class csv.Dialect
Dialect クラスは、属性に二重引用符、空白、区切り文字などの処理方法に関する情報が含まれているコンテナクラスです。 厳密なCSV仕様がないため、アプリケーションが異なれば、生成されるCSVデータも微妙に異なります。 Dialect インスタンスは、 reader および writer インスタンスの動作を定義します。
使用可能なすべての Dialect 名は、 list_dialects()によって返され、イニシャライザー(
__init__
)は次のように機能します。import csv with open('students.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile, dialect='unix') ^^^^^^^^^^^^^^
- class csv.excel
- excel クラスは、Excelで生成されたCSVファイルの通常のプロパティを定義します。 方言名
'excel'
で登録されています。
- class csv.excel_tab
- excel_tab クラスは、Excelで生成されたTAB区切りファイルの通常のプロパティを定義します。 方言名
'excel-tab'
で登録されています。
- class csv.unix_dialect
unix_dialect クラスは、UNIXシステムで生成されたCSVファイルの通常のプロパティを定義します。
'\n'
を行末記号として使用し、すべてのフィールドを引用します。 方言名'unix'
で登録されています。バージョン3.2の新機能。
- class csv.Sniffer
Sniffer クラスは、CSVファイルの形式を推測するために使用されます。
Sniffer クラスは、次の2つのメソッドを提供します。
- sniff(sample, delimiters=None)
指定されたサンプルを分析し、見つかったパラメーターを反映する方言サブクラスを返します。 オプションの delimiters パラメーターを指定すると、有効な区切り文字の可能性がある文字列として解釈されます。
- has_header(sample)
サンプルテキスト(CSV形式と推定)を分析し、最初の行が一連の列ヘッダーであると思われる場合は True を返します。
Sniffer の使用例:
with open('example.csv', newline='') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# ... process CSV file contents here ...
csv モジュールは、次の定数を定義します。
- csv.QUOTE_ALL
- writer オブジェクトにすべてのフィールドを引用するように指示します。
- csv.QUOTE_MINIMAL
- writer オブジェクトに、 delimiter 、 quotechar 、または lineterminator の任意の文字などの特殊文字を含むフィールドのみを引用するように指示します。
- csv.QUOTE_NONNUMERIC
writer オブジェクトに、数値以外のすべてのフィールドを引用するように指示します。
引用符で囲まれていないすべてのフィールドをタイプ float に変換するようにリーダーに指示します。
- csv.QUOTE_NONE
writer オブジェクトにフィールドを引用しないように指示します。 現在の区切り文字が出力データで発生する場合、その前に現在のエスケープ文字文字が付きます。 escapechar が設定されていない場合、エスケープが必要な文字が検出されると、ライターは Error を発生させます。
reader に引用符の特別な処理を実行しないように指示します。
csv モジュールは、次の例外を定義します。
- exception csv.Error
- エラーが検出されたときに、いずれかの関数によって発生します。
方言とフォーマットパラメータ
入力レコードと出力レコードの形式を簡単に指定できるように、特定の形式パラメーターが方言にグループ化されています。 方言は、 Dialect クラスのサブクラスであり、特定のメソッドのセットと単一のvalidate()
メソッドがあります。 reader または writer オブジェクトを作成する場合、プログラマーは Dialect クラスの文字列またはサブクラスを方言パラメーターとして指定できます。 dialect パラメーターに加えて、またはその代わりに、プログラマーは、 Dialect クラスに対して以下で定義されている属性と同じ名前を持つ個々のフォーマットパラメーターを指定することもできます。
方言は次の属性をサポートします。
- Dialect.delimiter
- フィールドを区切るために使用される1文字の文字列。 デフォルトは
','
です。
- Dialect.doublequote
フィールド内に表示される quotechar のインスタンス自体を引用する方法を制御します。 True の場合、文字は2倍になります。 False の場合、 escapechar が quotechar のプレフィックスとして使用されます。 デフォルトは True です。
出力時に、 doublequote が False であり、 escapechar が設定されていない場合、 quotechar がフィールドで見つかりました。
- Dialect.escapechar
- quote が QUOTE_NONE に設定されている場合、区切り文字をエスケープするためにライターが使用する1文字の文字列。の場合、 quotechar 。 doublequote は False です。 読むと、 escapechar は、次の文字から特別な意味を削除します。 デフォルトは None で、エスケープを無効にします。
- Dialect.lineterminator
writer によって生成された行を終了するために使用される文字列。 デフォルトは
'\r\n'
です。ノート
リーダーは、
'\r'
または'\n'
のいずれかを行末として認識するようにハードコードされており、改行子を無視します。 この動作は将来変更される可能性があります。
- Dialect.quotechar
- 区切り文字や quotechar などの特殊文字を含むフィールド、または改行文字を含むフィールドを引用するために使用される1文字の文字列。 デフォルトは
'"'
です。
- Dialect.quoting
- 引用符がライターによって生成され、リーダーによって認識されるタイミングを制御します。
QUOTE_*
定数のいずれかを取ることができ(セクションモジュールの内容を参照)、デフォルトは QUOTE_MINIMAL です。
- Dialect.strict
True
の場合、不正なCSV入力で例外エラーを発生させます。 デフォルトはFalse
です。
リーダーオブジェクト
リーダーオブジェクト( DictReader インスタンスおよび reader()関数によって返されるオブジェクト)には、次のパブリックメソッドがあります。
- csvreader.__next__()
- リーダーの反復可能なオブジェクトの次の行をリスト(オブジェクトが reader()から返された場合)またはdict( DictReader インスタンスの場合)として返し、以下に従って解析されます。現在の方言。 通常、これを
next(reader)
と呼ぶ必要があります。
リーダーオブジェクトには、次のパブリック属性があります。
- csvreader.dialect
- パーサーが使用している方言の読み取り専用の説明。
- csvreader.line_num
- ソースイテレータから読み取られた行数。 レコードは複数の行にまたがることができるため、これは返されるレコードの数と同じではありません。
DictReaderオブジェクトには、次のパブリック属性があります。
- csvreader.fieldnames
- オブジェクトの作成時にパラメーターとして渡されない場合、この属性は、最初のアクセス時、または最初のレコードがファイルから読み取られるときに初期化されます。
ライターオブジェクト
Writer
オブジェクト( DictWriter インスタンスおよび writer()関数によって返されるオブジェクト)には、次のパブリックメソッドがあります。 row は、Writer
オブジェクトの文字列または数値の反復可能であり、フィールド名を文字列または数値にマッピングする辞書である必要があります(最初に str()を介して渡すことにより) DictWriter オブジェクト。 複素数は、parensで囲まれて書き出されることに注意してください。 これにより、CSVファイルを読み取る他のプログラムで問題が発生する可能性があります(複素数をサポートしていると仮定した場合)。
- csvwriter.writerow(row)
row パラメーターを、現在の Dialect に従ってフォーマットされたライターのファイルオブジェクトに書き込みます。 基になるファイルオブジェクトの write メソッドへの呼び出しの戻り値を返します。
バージョン3.5で変更:任意の反復可能オブジェクトのサポートが追加されました。
- csvwriter.writerows(rows)
- rows (上記の row オブジェクトの反復可能)内のすべての要素を、現在の方言に従ってフォーマットされたライターのファイルオブジェクトに書き込みます。
ライターオブジェクトには、次のパブリック属性があります。
- csvwriter.dialect
- ライターが使用している方言の読み取り専用の説明。
DictWriterオブジェクトには、次のパブリックメソッドがあります。
- DictWriter.writeheader()
(コンストラクターで指定された)フィールド名を含む行を、現在の方言に従ってフォーマットされたライターのファイルオブジェクトに書き込みます。 内部で使用される csvwriter.writerow()呼び出しの戻り値を返します。
バージョン3.2の新機能。
バージョン3.8で変更: writeheader()は、内部で使用する csvwriter.writerow()メソッドによって返される値も返すようになりました。
例
CSVファイルを読み取る最も簡単な例:
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
別の形式でファイルを読み取る:
import csv
with open('passwd', newline='') as f:
reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
print(row)
対応する最も単純な書き込み例は次のとおりです。
import csv
with open('some.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(someiterable)
open()は読み取り用にCSVファイルを開くために使用されるため、ファイルはデフォルトでシステムのデフォルトエンコーディングを使用してUnicodeにデコードされます( locale.getpreferredencoding()を参照)。 別のエンコーディングを使用してファイルをデコードするには、openのencoding
引数を使用します。
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
同じことが、システムのデフォルトエンコーディング以外の書き込みにも当てはまります。出力ファイルを開くときにencoding引数を指定します。
新しい方言の登録:
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd')
リーダーのもう少し高度な使用法—エラーのキャッチと報告:
import csv, sys
filename = 'some.csv'
with open(filename, newline='') as f:
reader = csv.reader(f)
try:
for row in reader:
print(row)
except csv.Error as e:
sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))
モジュールは文字列の解析を直接サポートしていませんが、簡単に実行できます。
import csv
for row in csv.reader(['one,two,three']):
print(row)
脚注
- 1( 1 、 2 )
newline=
が指定されていない場合、引用符で囲まれたフィールド内に埋め込まれた改行は正しく解釈されず、書き込み時に\r\n
行を使用するプラットフォームでは追加の\r
が追加されます。 csvモジュールは独自の(ユニバーサル)改行処理を行うため、newline=
を指定することは常に安全です。