データをファイルに保存することは、開発者の生活の中で最もよく遭遇するプログラミング作業の1つです。
一般に、プログラムは何らかの入力を受け取り、何らかの出力を生成します。
この結果を保存しておきたいケースは数多くあります。
ブラウズするWebページ、レポートに使う表形式のデータの単純なダンプ、機械学習やトレーニング、アプリケーション実行時のロギングなど、私たちは手動で行うよりも、アプリケーションがファイルに書き出すことに依存しています。
Pythonを使えば、サードパーティのライブラリを使わなくても、様々なタイプのファイルを保存することができます。
この記事では、Pythonで最も一般的なファイル形式の保存に飛び込みます。
ファイルを開く、閉じる
ファイルを開く
ファイルの内容は、開いたときにアクセスでき、閉じた後は読み書きができなくなります。
Pythonでファイルを開くのは簡単です。
my_data_file = open('data.txt', 'w')
ファイルを開くには、ファイル名(相対パスか絶対パス)が必要です。
第2引数はモードで、これは開いているファイルに対してできるアクションを決定します。
よく使われるものをいくつか紹介します。
- r` – (デフォルトモード) ファイルを読み込みに開きます。
- w` – 書き込み用にファイルを開きます。ファイルがすでに存在する場合は、内容を上書きします。
-
x
– 新しいファイルを作成します。ファイルが存在する場合は失敗します。 -
a
– 書き込み用にファイルを開く。ファイルが既に存在する場合は、新しいデータをそのコンテンツの最後に追加する。 -
b
– ファイルにデフォルトのテキストデータではなく、バイナリデータを書き込む。 -
+
– モードに対する読み込みと書き込みを許可する
例えば、ファイルに書き込みを行い、その後読み込みを行いたい場合、モードは ‘w+’ であるべきだとする。
ファイルに書き込んでから、前の内容を削除せずに読み込む場合は、’a+’ を使用します。
ファイルのクローズ
Pythonでは、ファイルを閉じるのがもっと簡単です。
my_data_file.close()
単にファイルオブジェクトのcloseメソッドを呼び出せばいいのです。
ファイルを使い終わったら閉じることは重要で、そうする良い理由がたくさんあります。
- オープンなファイルは RAM のスペースを占有します。
- オープンなファイルは RAM のスペースを占有します。
- OSが開くことのできるファイル数には限りがあります。
小さなスクリプトでは、これらは緊急の問題ではなく、いくつかのPythonの実装は実際にあなたのために自動的にファイルを閉じますが、大きなプログラムでは、ファイルを閉じることを偶然に任せず、使用したリソースを解放することを確認してください。
withキーワードの使い方
ファイルを閉じることは簡単に忘れてしまうものです、結局は人間ですから。
幸運なことに、Pythonにはファイルを使用し、終了したら自動的に閉じるメカニズムがあります。
これを行うには、単に with
キーワードを使用する必要があります。
with open('data.txt', 'w') as my_data_file:
# TODO: write data to the file
# After leaving the above block of code, the file is closed
このファイルは with
キーワードを使った後にインデントされた、 # TODO
コメントとしてマークされたすべてのコードに対して開かれます。
そのコードのブロックが完了すると、ファイルは自動的に閉じられます。
これは、リソースを解放するために手動でファイルを閉じる必要がなく、プログラミングのより重要な側面に注意を向けるためのフェイルセーフメカニズムを提供するため、ファイルを開いて書き込むための推奨される方法です。
テキストファイルの保存
さて、ファイルにアクセスする最良の方法がわかったので、さっそくデータを書き込んでみましょう。
幸いなことに、Pythonはこれも簡単にしてくれます。
with open('do_re_mi.txt', 'w') as f:
f.write('Doe, a deer, a female deer
')
f.write('Ray, a drop of golden sun
')
write()関数は文字列を受け取り、その内容をファイルストリームに書き出します。
保存はしませんが、write()`関数は入力された文字数、つまり入力文字列の長さを返します。
注:改行文字である ament
が含まれていることに注意してください。
これはファイルの次の行に書き込むために使用されます。
そうしないと、すべてのテキストが1行として追加されます。
複数の行を一度に保存する
write()` 関数を使えば、1つの文字列をファイルに書き出すことができます。
もし、一度に複数の行を書きたい場合はどうすればよいでしょうか。
writelines()` 関数を使えば、データをリストやタプルのような連続した形式でファイルに保存することができます。
with open('browsers.txt', 'w') as f:
web_browsers = ['Firefox
', 'Chrome
', 'Edge
']
f.writelines(web_browsers)
前と同じように、データを改行で表示させたい場合は、各文字列の最後に改行文字を含めます。
もし、リストの各項目の後に手動で改行文字を入力する手順を省きたい場合は、簡単に自動化することができます。
with open('browsers.txt', 'w') as f:
web_browsers = ['Firefox
', 'Chrome
', 'Edge
']
f.writelines("%s
" % line for line in web_browsers)
注意: writelines()
の入力は、文字列かバイトのフラットシーケンスでなければなりません。
数値やオブジェクト、リストの中にリストがあるようなネストされたシーケンスは許可されません。
リストとタプルについてもっと知りたい場合は、Lists vs Tuples in Pythonという記事がありますので、そちらを参照してください。
CSVファイルの保存
CSV (Comma Separated Values) ファイルは、表形式のデータを保存するために一般的に使用されます。
その人気のため、Pythonはこのタイプのファイルを簡単に書くためのメソッドをいくつか内蔵しています。
import csv
weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
sales = ['10', '8', '19', '12', '25']
with open('sales.csv', 'w') as csv_file:
csv_writer = csv.writer(csv_file, delimiter=',')
csv_writer.writerow(weekdays)
csv_writer.writerow(sales)
まず最初に、csv
ライブラリをインポートして、ヘルパー関数を取得する必要があります。
いつものようにファイルを開きますが、csv_file
オブジェクトに内容を書き込むのではなく、csv_writer
という新しいオブジェクトを作成します。
このオブジェクトは writerow()
メソッドを提供し、すべての行のデータを一度にファイルに書き込むことを可能にしてくれます。
PythonでCSVファイルを使うことについてもっと詳しく知りたい方は、こちらを参照してください。
PythonでCSVファイルの読み書きをする。
JSONファイルの保存
JSONはデータを保存するためのもう一つの一般的なフォーマットで、CSVと同様に、Pythonは辞書データをJSONファイルに書き込むことを非常に簡単にしています。
import json
my_details = {
'name': 'John Doe',
'age': 29
}
with open('personal.json', 'w') as json_file:
json.dump(my_details, json_file)
jsonライブラリをインポートして、ファイルを開く必要があります。
実際にデータをファイルに書き込むには、dump()` 関数を呼び出して、データ辞書とファイルオブジェクトを渡せばよいのです。
PythonでJSONファイルを使うことについてもっと知りたい場合は、こちらの記事を参照してください。
PythonでファイルにJSONを読み書きする。
結論
ファイルを保存することは、私たちが書く様々な種類のプログラムで便利に使うことができます。
Pythonでファイルを書き込むには、まずファイルを開いて、後で閉じることを確認する必要があります。
書き込みが終わったら自動的にファイルが閉じられるように、 with
キーワードを使うのがベストです。
文字列の内容をファイルに書き込むには write()
メソッドを、一連のテキストをファイルに書き込むには writelines()
メソッドを使用します。
CSVやJSONのデータについては、Pythonが提供する特別な関数を使って、ファイルを開いた後でデータをファイルに書き込むことができます。