csv, tsvファイルをpythonで扱うには、標準ライブラリcsvモジュール(import csv)を使う。
なぜなら、ややこしいcsvの改行とか、区切り文字とか、エスケープ文字とかの問題を容易く扱えるようになるからである。
このページでは、実務で利用するcsvモジュールの使用方法を記載する。
csvファイルの読込み(csv.reader)
例えば、以下のようなファイルを読み込みましょう
Satoko,20
Jiro,40
with openで読み込んだファイルをオブジェクトを引数にcsv.readerを呼び出し、forループを用いて、一行ずつファイルの中身を読み込むことができる。
- ファイルの読みこみサンプル
csv_reader = csv.reader(fh, delimiter=',', quotechar='|')
for row in csv_reader:
print(row) # ['Taro', '18'] ['Satoko', '20'] ['Jiro', '40']の順で表示
print(row[0]) # Taro Satoko Jiroの順で表示
print(csv_reader.line_num) # 0, 1, 2の順で表示
例えば、ファイルのなかで改行がある場合、quotecharでクオート文字を指定する。
下記のようなcsvを読み込む場合、どのようにするのか以下に記述する。
Taro,"1 ← ここが改行されている。改行とわかるように"で囲っている
8"
Satoko,20
Jiro,40
- csvが途中で改行されている場合の読込み
csv_reader = csv.reader(fh, delimiter=',', quotechar='"') # quotecharでクオート文字を指定しています(デフォルトはダブルクオート)
csvファイルの読込み(csv.DictReader)
DictReaderとは、csvでファイルを読み込む際にヘッダーはヘッダーで、中身は中身で読み込みたい。
そんな時に便利!!
例えば、ヘッダー付きのcsvがあった場合、DictReaderでそのまま指定しましょう。
delimiterでカンマ区切りかタブ区切りか指定する。
Taro,18
Satoko,20
Jiro,40
- csvの1行目がヘッダーになっている場合
with open(file_path) as fh:
csv_reader = csv.DictReader(fh, delimiter=',')
csv_header = csv_reader.fieldnames # これがヘッダーの一覧、例だとNameとAge
for row in csv_reader: # 読み込んだcsvの中身をループする。rowには1行目2行目が入る。typeはDict
print(row['Name']) # Nameだけ取り出したい場合、例だとTaro,Satoko,Jiro
csvにヘッダーがない場合も、ヘッダーがあるかのように扱いたいということもある。
例えば以下のような例。この場合はfieldnamesでヘッダーを指定する
Satoko,20
Jiro,40
- csvにヘッダーがない場合
with open(file_path) as fh:
csv_reader = csv.DictReader(fh, delimiter=',', , fieldnames=['Name', 'Age']) # ここでfieldnamesを指定する。これがヘッダーになる
for row in csv_reader: # 読み込んだcsvの中身をループする。rowには1行目2行目が入る。typeはDict
print(row['Name']) # Nameだけ取り出したい場合、例だとTaro,Satoko,Jiro
CSVファイルへの書き込み(csv.writer)
ファイルへの出力をする場合、csv.writerでファイル出力用のインスタンスを作成する。
作成の際には以下のようにパラメータを指定する
- csv.writerを利用したファイルへの出力
csv_writer = csv.writer(fh, delimiter='\t', quotechar='"', quoting=csv.QUOTE_MINIMAL)# タブ区切りで出力
csv_writer.writerows([['a','b','c'],[1,2,3]])# a b cと1 2 3を出力
実行した結果、以下のようにファイルに文字列が出力される
- 出力ファイル
1 2 3
csv.writerにdelimiter, quotecharなどの引数はそれぞれ以下の意味を持っている。
- csv.writerの引数
| delimter | 区切り文字を指定、\tの場合はタブ、デフォルトはカンマ(,) |
| quotechar | 改行を含むフィールドを囲う際に用いられる文字(クオート文字) |
| quoting | QUOTE_ALL: すべてのフィールドをクオートする QUOTE_MINIMAL: quotecharや改行など特別な文字だけクオートする QUOTE_NONNUMERIC: 非数値のフィールドだけクオートする QUOTE_NONE: クオートしない |
csvファイルへのヘッダーを指定して書き込み(csv.DictWriter)
csv.DictWriterでファイル出力用のインスタンス作成。
fieldsnameでヘッダーを指定する。writerowでは、辞書を指定する。
- csv.DictWriterを利用したファイルへの出力
fieldnames = ['name', 'age']
csv_writer = csv.DictWriter(fh, fieldnames=fieldnames) # デフォルトはカンマ(,)区切り
# csv_writer = csv.DictWriter(fh, fieldnames=fieldnames, delimiter='\t') # タブ区切り
csv_writer.writeheader() # ヘッダーの書き込み
csv_writer.writerow({'age': 19, 'name': 'Taro'}) # nameに対して、Taro, ageに対して19で書き込み
csv_writer.writerows([{'name': 'Hanako', 'age': 30}, {'name': 'Jiro', 'age': 40}]) # 複数行の書き込み
実行した結果、以下のように出力される
- 出力ファイル
Taro,19
Hanako,30
Jiro,40
まとめ
- csvファイルの読込みには、csv.readerで、delimiterは区切り文字、quotecharはクオート文字を指定
- 辞書形式で読込みには、csv.DictReaderを利用
- csvファイルの書き込みには、csv.writerで、delimiterは区切り文字、quotecharはクオート文字を指定
- 辞書形式での書き込みは、csv.DictWriterで、writeheaderでヘッダーの書き込み、writerow, writerowsで書き込みを行う
Pythonについてもっと知りたい!というかたはこちら、Pythonの基本文法から標準ライブラリ、応用ライブラリまで収録!!
【2020年版】: Python 3.8 データ構造、文法、アルゴリズム、オブジェクト指向、ライブラリ、完全マスター講座
