Python で CSV ファイルの読み書きを実装します。
CSV ファイルは様々な用途で利用するファイル形式です。Python では標準の csv モジュールがありますので、サードパーティのパッケージ不要で、CSV ファイルの読み書きをすることができます。
CSV は、Comma Separated Values (カンマ区切りの値)が正式名称って、意外に知らない人多いんですよね。
Contents
バージョン
- Python 3.5.4
実装
CSV ファイルの読み込み
import csv ''' $ cat example.csv 4/5/2014 13:34,Apples,73 4/5/2014 3:41,Cherries,85 4/6/2014 12:46,Pears,14 4/8/2014 8:59,Oranges,52 4/10/2014 2:07,Apples,152 4/10/2014 18:10,Bananas,23 4/10/2014 2:40,Strawberries,98 ''' example_file = open('example.csv') example_reader = csv.reader(example_file) example_data = list(example_reader) print(example_data[0][0]) # 4/5/2014 13:34 print(example_data[0][1]) # Apples print(example_data[0][2]) # 73 print(example_data[1][1]) # Cherries print(example_data[6][1]) # Strawberries #print(example_data[10][10]) # IndexError: list index out of range example_file.close() example_file = open('example.csv') example_reader = csv.reader(example_file) # CSVデータの読み込み for row in example_reader: print('Row #' + str(example_reader.line_num) + ' ' + str(row))
CSV ファイルの読み込みは、まず最初に、ファイルを open し、reader 関数にファイルオブジェクトを渡します。
その後のデータのアクセス方法としては、list に変換してインデックスでアクセスする方法と for でアクセスする方法の2つを実装しました。
list に変換する方法は、インデックス指定ができて便利ですが、一度にデータを読み込みます。なので、ファイルサイズによっては、大量にメモリを消費する可能性がありますので、注意が必要です。
CSV ファイルの書き込み
# CSVファイルの作成 output_file = open('output.csv', 'w') output_writer = csv.writer(output_file) output_writer.writerow(['spam', 'eggs', 'bacon', 'ham']) output_writer.writerow(['Hello, world!', 'eggs', 'bacon', 'ham']) output_writer.writerow([1, 2, 3.141592, 4]) output_file.close()
CSV ファイルの書き込みは、まず最初に、書き込みオプションをつけてファイルを open し、writer 関数にファイルオブジェクトを渡します。
その後のデータの書き込み方法としては、一行ずつデータを書き込む writerow 関数を実装しました。
TSV ファイルの書き込み
# TSVファイルの作成 csv_file = open('example.tsv', 'w') csv_writer = csv.writer(csv_file, delimiter='\t') csv_writer.writerow(['apples', 'oranges', 'grapes']) csv_writer.writerow(['eggs', 'bacon', 'ham']) csv_writer.writerow(['spam', 'spam', 'spam']) csv_file.close()
writer 関数の引数の delimiter オプションで区切り文字が指定できるので、’\t’ を渡すと、タブ区切りの TSV ファイルを作成することができます。
プログラム全体
import csv ''' $ cat example.csv 4/5/2014 13:34,Apples,73 4/5/2014 3:41,Cherries,85 4/6/2014 12:46,Pears,14 4/8/2014 8:59,Oranges,52 4/10/2014 2:07,Apples,152 4/10/2014 18:10,Bananas,23 4/10/2014 2:40,Strawberries,98 ''' example_file = open('example.csv') example_reader = csv.reader(example_file) example_data = list(example_reader) print(example_data[0][0]) # 4/5/2014 13:34 print(example_data[0][1]) # Apples print(example_data[0][2]) # 73 print(example_data[1][1]) # Cherries print(example_data[6][1]) # Strawberries #print(example_data[10][10]) # IndexError: list index out of range example_file.close() example_file = open('example.csv') example_reader = csv.reader(example_file) # CSVデータの読み込み for row in example_reader: print('Row #' + str(example_reader.line_num) + ' ' + str(row)) # CSVファイルの作成 output_file = open('output.csv', 'w') output_writer = csv.writer(output_file) output_writer.writerow(['spam', 'eggs', 'bacon', 'ham']) output_writer.writerow(['Hello, world!', 'eggs', 'bacon', 'ham']) output_writer.writerow([1, 2, 3.141592, 4]) output_file.close() # TSVファイルの作成 csv_file = open('example.tsv', 'w') csv_writer = csv.writer(csv_file, delimiter='\t') csv_writer.writerow(['apples', 'oranges', 'grapes']) csv_writer.writerow(['eggs', 'bacon', 'ham']) csv_writer.writerow(['spam', 'spam', 'spam']) csv_file.close()
ここまで説明してきた内容を sample.py という名前で保存しました。
動作確認
プログラムの実行
$ python sample.py 4/5/2014 13:34 Apples 73 Cherries Strawberries Row #1 ['4/5/2014 13:34', 'Apples', '73'] Row #2 ['4/5/2014 3:41', 'Cherries', '85'] Row #3 ['4/6/2014 12:46', 'Pears', '14'] Row #4 ['4/8/2014 8:59', 'Oranges', '52'] Row #5 ['4/10/2014 2:07', 'Apples', '152'] Row #6 ['4/10/2014 18:10', 'Bananas', '23'] Row #7 ['4/10/2014 2:40', 'Strawberries', '98']
sample.py を実行すると、CSV ファイルを読み込み、その内容を出力します。
また、CSV ファイルの書き込みとTSV ファイルの書き込み結果については、以下の通りとなります。
CSV ファイルの書き込み結果
$ cat output.csv spam,eggs,bacon,ham "Hello, world!",eggs,bacon,ham 1,2,3.141592,4
TSV ファイルの書き込み結果
$ cat example.tsv apples oranges grapes eggs bacon ham spam spam spam
まとめ
Python で CSV ファイルの読み書きを実装しました。
他にも複数行の書き込みができる writerows 関数や、データを辞書型で扱うことができる DictReader と DictWriter などがありますので、一度公式のドキュメントに目を通すことをお勧めします。