Pythonでファイル出力(CSV形式で)【適当な方法とちゃんとした方法】
- 作成日: 2022-04-21
- 更新日: 2023-12-25
- カテゴリ: Python
PythonでCSV形式でファイル出力
今回はPythonでデータをCSV形式にしてファイルに出力する方法を見ていきます。
CSVはよく使われるデータ形式で、ちょっとしたデータをファイルに保存したいときに使います。
CSVとは「Comma Separated Value(カンマ区切りの値)」の略です。
「aaa,bbb,ccc」みたいなカンマで区切られたデータの並びのことですね。
具体的に見ていきましょう。
🦝 < CSVでファイル出力、保存
関連記事
頭が悪い人のPythonのevalの使い方
頭がいい人のPythonのexitの使い方
状態遷移による文字列パースのテクニック【Python】
頭が悪い人のPythonのevalの使い方
頭がいい人のPythonのexitの使い方
自作関数read_fileでファイルを読み込み【ファイル入出力, コマンド】
リストを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
csv
のwriter()
というクラスを使うとリスト内のデータを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データを出力する
🐭 < カンマ、カンマ、カンマ