Pythonでファイル出力(CSV形式で)【適当な方法とちゃんとした方法】
目次
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
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データを出力する
カンマ、カンマ、カンマ
関連動画
関連記事
- Pythonのリストにデータを追加(append)する方法【extend, insert, スライス】
- Pythonでbytes型をstr型に(byte to string)変換する
- Pythonのリストのappend()の使い方【初心者向け完全解説】
- Pythonで複数のフォルダを作成する方法【os.mkdir, os.makedirs】
- Pythonの可変長引数(*args, **kwargs)にリスト、タプル、辞書を展開して渡す
- Pythonでべき乗する方法(**演算子とpow関数)
- Pythonのstr.split()で最初だけ分割する
- PythonのGUIライブラリTkinterでウィンドウを作る方法