CSVファイルの読み書き | Python-izm

CSVファイルの読み書き

Pythonでは標準ライブラリでCSV形式のファイルの読み書きを容易に行うことができる機能が用意されています。

CSVファイルの書き込み

次の例では、新規ファイルを開きCSV形式で書き込みを行っています。

import csv

csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(csv_file)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()

次のようなCSVファイルが生成されます。

python,-,izm,1
python,-,izm,2
python,-,izm,3
"p,y,t,h,o,n",-,"i,z,m",4

1行目でcsvモジュールのインポートを行い、3行目でファイルオブジェクトを開きます。4行目ではファイルオブジェクトを引数に取り、csvのwriterを取得しています。

import csv

csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(csv_file)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()

writerowを用いてCSVファイルへ書き込みを行います。これは1行だけの書き込みです。

import csv

csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(csv_file)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()

複数行を一度に書き込む事も可能です。例ではリストへ1行あたりの値を設定したタプルを追加し、writerowsで一度に3行の書き込みを行っています。また生成されたCSVファイルを見ればわかる通り、クォートが必要な値(‘p,y,t,h,o,n’‘i,z,m’)はデフォルトのクォート文字である「 ” 」で囲われて出力されるので非常に便利です。

import csv

csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(csv_file)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()

CSVのフォーマットを指定

出力するCSVの形式(フォーマット)を設定することもできます。次の例ではクォート対象をすべての値(quoting=csv.QUOTE_ALL)、デリミタを(‘:’)、クォート文字を‘`’へ設定してます。先の例で生成されたCSVファイルと比べてみてください。

import csv

csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(
    csv_file, 
    quoting=csv.QUOTE_ALL, 
    delimiter=':',
    quotechar='`'
)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()
`python`:`-`:`izm`:`1`
`python`:`-`:`izm`:`2`
`python`:`-`:`izm`:`3`
`p,y,t,h,o,n`:`-`:`i,z,m`:`4`

あらかじめ用意されているCSVフォーマット

Pythonにはすでに用意されているCSVフォーマットがいつかあります。次の例はdialectcsv.excel_tabを指定することで、区切り文字をタブ文字( ¥t )で出力しています。

import csv

csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(
    csv_file, 
    dialect=csv.excel_tab,
)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()
python	-	izm	1
python	-	izm	2
python	-	izm	3
p,y,t,h,o,n	-	i,z,m	4

独自のフォーマットを定義する

独自のフォーマットを用意し、それをいつでも適用できるようにする場合は既存のdialectを継承するとよいでしょう。次の例ではcsv.excelを継承し、クォート対象をすべての値(quoting=csv.QUOTE_ALL)とするようにしています。

import csv


class CustomFormat(csv.excel):
    quoting = csv.QUOTE_ALL


csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(
    csv_file, 
    dialect=CustomFormat(),
)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()
"python","-","izm","1"
"python","-","izm","2"
"python","-","izm","3"
"p,y,t,h,o,n","-","i,z,m","4"

独自のフォーマットを登録する

とあるアプリケーションで共通のCSVファイルフォーマットを適用したい場合、登録しておくと便利です。次のようにmyformatという名称で簡単に登録および適用を行うことができます。

import csv


class CustomFormat(csv.excel):
    quoting = csv.QUOTE_ALL


# 登録しておく
csv.register_dialect('myformat', CustomFormat)

csv_file = open('./python.csv', 'w', newline='')
writer = csv.writer(
    csv_file, 
    dialect='myformat',
)

row = ('python', '-', 'izm', '1')
writer.writerow(row)

rows = []
rows.append(('python', '-', 'izm', '2'))
rows.append(('python', '-', 'izm', '3'))
rows.append(('p,y,t,h,o,n', '-', 'i,z,m', '4'))
writer.writerows(rows)

csv_file.close()

なお、これらのフォーマット設定はCSVファイルの読み込みでも有効です。

CSVファイルの読み込み

次の例は、先ほど出力したCSV形式のファイルを読み込み、取得した値を表示しています。読み込みを行うCSVファイルは次の通りです。

python,-,izm,1
python,-,izm,2
python,-,izm,3
"p,y,t,h,o,n",-,"i,z,m",4

1行目でcsvモジュールのインポートを行い、3行目でファイルオブジェクトを開きます。4行目ではファイルオブジェクトを引数に取り、csvのreaderを取得しています。読み込みはfor文を用いることで1行ずつ取得することができ、例示ソースコードではrowへ1行分のデータが格納されます。1行分のデータに対してさらにfor文を用いることにより各値を順次取得しています。

import csv

csv_file = open('./python.csv', 'r', newline='')
reader = csv.reader(csv_file)

for row in reader:
    print('-------------------')
    for cell in row:
        print(cell)

csv_file.close()

先にも述べた通り、フォーマット設定は読み込み時にも有効です。たとえばタブ文字区切りのファイルの読み込みを行う場合delimiter=’¥t’を指定するとよいでしょう。