Pythonでファイル出力(CSV形式で)【適当な方法とちゃんとした方法】

458, 2022-04-21

目次

PythonでCSV形式でファイル出力

今回はPythonでデータをCSV形式にしてファイルに出力する方法を見ていきます。
CSVはよく使われるデータ形式で、ちょっとしたデータをファイルに保存したいときに使います。

CSVとは「Comma Separated Value(カンマ区切りの値)」の略です。
「aaa,bbb,ccc」みたいなカンマで区切られたデータの並びのことですね。

具体的に見ていきましょう。

(^ _ ^)

CSVでファイル出力、保存

関連記事
Pythonのcsvモジュールの使い方

Pythonの別ファイルのclass(クラス)の使い方
Pythonでファイルをコピーする方法4選: copyfile, copy, copy2, copytree
Pythonでファイルにデータを書き込む3つの方法

リストをjoin()でカンマ区切りにする

リストに入ってるデータをカンマ区切りにするには文字列のメソッドjoin()を使うと簡単です。
join()を使った方法は簡便ですが、ちゃんとしたプログラムを作りたい場合は後述のcsvモジュールを使った方法を採用してください。

join()で↓みたいにリスト内のデータをCSV形式にできます。

data = ','.join(['123', '456', '789'])
print(data)
# 123,456,789

これが一番簡単にリストをCSV形式にする方法ですが、簡単ゆえに注意点も多いです。
たとえばリスト内のデータが文字列じゃない場合は、join()に失敗します。
それからこの方法で生成されるCSVは、ちゃんとしたCSVではありません。

CSVにはRFCという規格でちゃんとフォーマットが決められているんですが、この簡易的な方法ではその規格には対応できないんですね。
たとえばデータの中にカンマが含まれていた場合は、自分でダブルクオーテーションでエスケープしなきゃいけません。

data = ','.join(['123', '"456,789"', 'abc'])
print(data)
# 123,"456,789",abc

まあ細かいことは置いておいてこのデータをファイルに出力してみましょう。
ファイルを開くにはopen()を使いますが、モードにはwtを指定します。

data = ','.join(['abc', 'def', 'ghi'])

with open('data.csv', 'wt', encoding='utf-8') as fout:
    fout.write(data + '\n')
    fout.write(data + '\n')

↑のコードを実行するとdata.csvというCSVファイルが作られます。
中身は↓こんな感じです。

abc,def,ghi
abc,def,ghi

open()では第1引数にファイル名、第2引数にモード、そしてencodingにエンコーディングを指定します。
wtモードはテキストファイルで書き込みするモードです。

encodingにはutf-8を指定してます。
WindowsではデフォルトのエンコーディングがCP932になります。
ファイルをUTF-8で扱いたい場合はこのようにエンコーディングを指定しておくようにします。

fout.write(data + '\n')を2回実行してデータ(行)を2行書き込んでいます。
CSVでは1行が1レコードで、まとまったデータの単位です。
今回は同じデータで複数行書き込んでみました。

data + '\n'」とやってデータのお尻に改行を付けている点に注意が必要です。
join()は改行を付加しないのでこのように自分で改行を付ける必要があります。

csvモジュールでリストを出力

ちゃんとRFCに対応しているパーサーが欲しいところです。
もちろんPythonには標準であります。
その名もcsvです。

import csv

csvwriter()というクラスを使うとリスト内のデータをCSV形式で出力できます。
リストのデータを書き込む場合はwriterow()というメソッドを使います。

# ライター(書き込み者)を作成
writer = csv.writer(出力先ファイルオブジェクト)

# ライターでデータ(リスト)をファイルに出力
writer.writerow(書き込むデータ)
writer.writerow(書き込むデータ)

実際のコードは↓みたいな感じです。

import csv

with open('data.csv', 'wt', encoding='utf-8') as fout:
    # ライター(書き込み者)を作成
    writer = csv.writer(fout)

    # ライターでデータ(リスト)をファイルに出力
    writer.writerow([111, 222, 333])
    writer.writerow(['aaa', 'bb,bb', 'ccc'])

↑のコードを実行すると↓の結果になります。

111,222,333
aaa,"bb,bb",ccc

ちゃんとカンマが含まれているデータがダブルクオーテーションでエスケープされていますね。
これはcsvが勝手にやってくれてます。

(^ _ ^)

優秀!

csvモジュールで2次元リストを出力

csvモジュールで2次元リストも出力できます。
↓みたいな2次元のリスト、行列があります。

mat = [
    [111, 222, 333],
    ['aaa', 'bb,bb', 'ccc'],
]

これはwriter.writerows()に渡すと書き込めます。
お尻にsが付いてて複数形になってるメソッドです。

2次元リストを書き込む場合はコツがあって、open()newline=''を指定しておきます。
こうするとちゃんとした改行で書き込まれます。
newline=''を付けない場合は改行が2つになったりするので注意です!

import csv

mat = [
    [111, 222, 333],
    ['aaa', 'bb,bb', 'ccc'],
]

with open('mat.csv', 'wt', encoding='utf-8', newline='') as fout:
    # ライター(書き込み者)を作成
    writer = csv.writer(fout)

    # ライターでデータ(行列)をファイルに出力
    writer.writerows(mat)

mat.csvの出力結果は↓です。

111,222,333
aaa,"bb,bb",ccc

おわりに

今回は以上です!
PythonでCSV形式でデータをファイル出力する方法について解説しました。
CSVでデータを扱えるようになっておけば便利ですね。

(^ _ ^)

CSVデータを出力する

(・ v ・)

カンマ、カンマ、カンマ

この記事のアンケートを送信する