以前紹介した記事で、pandasのread_csv、read_table関数によるcsvファイルの読み込み方法を紹介したが、今回はPython組み込みのcsvモジュールを使ったcsvファイルの取り扱いについて説明する。

サンプルファイルの用意

ターミナルのviコマンドで下記のようなcsvファイルを用意する。

# ~/examples/ex5.csv
"a","b","c"
"1","2","3"
"4","5","6"

csvモジュールでファイルを読み込む

区切り文字が1文字であれば、どのようなファイルに対してもcsvモジュールでファイルを読み込むことができる。

モジュールを使う場合は、ファイルオブジェクトをオープンし、reader関数に引数として渡す。

import csv

f = open('examples/ex5.csv')
reader = csv.reader(f)

ファイルの行ごとに処理をおこなう

csv.readerから渡されたオブジェクトに対し、繰り返し処理をおこなうことで各行の値をタプル形式で扱うことができる。

for line in reader:
    print(line)
    
# ['a', 'b', 'c']
# ['1', '2', '3']
# ['4', '5', '6']

読み込んだcsvファイルを加工する

読み込んだcsvファイルをこの後どういった形式に加工し取り扱うかは自由にしてもらえれば良いが、ここではディクショナリ形式に加工する一例を紹介する。

import csv

with open('examples/ex5.csv') as f:
    lines = list(csv.reader(f))
    # [['a', 'b', 'c'], ['1', '2', '3'], ['4', '5', '6']]

header, values = lines[0], lines[1:]
# header: ['a', 'b', 'c']
# values: [['1', '2', '3'], ['4', '5', '6']]

data_dict = {h: v for h, v in zip(header, zip(*values))}
# {'a': ('1', '4'), 'b': ('2', '5'), 'c': ('3', '6')}

csv.readerで読み込んだオブジェクトを、header・valuesとそれぞれのリストへ分割し、ディクショナリ内包表記を使ってdata_dictディクショナリを作成している。

csvファイルのルールを定義する

csvファイルには、区切り文字をカンマにしたりタブにしたり、値を引用符で囲むなど、あらゆる形式(ルール)がある。

このルールは各々で自由に決めることができるが、決めたルールをクラスとして定義することができる。

import csv

class my_rule(csv.Dialect):
    lineterminator = '\n' # 行の終端記号
    delimiter = ';' # 区切り文字
    quotechar = '"' # 文字列を囲む引用符
    quoting = csv.QUOTE_ALL # 引用符で囲むルール(QUOTE_ALLは全てを引用符で囲む)

f = open('examples/ex5.csv')
reader = csv.reader(f, dialect=my_rule)

上記の例ではクラスを定義したが、csv.readerのオプションとして直接指定することも可能だ。

reader = csv.reader(f, delimiter='|')