前回の記事ではwhileループについて取り扱いました。この記事では計算条件などが書かれたファイルなどを読み書きするためのファイル入出力について学びます。
Pythonでファイルを開き、書き込む
Pythonにおけるファイル入出力の流れとしてはファイルを開き、文字列を書き込み、ファイルを閉じるという3つの要素からなっています。ファイルを開くにはopenという関数を使います。次のプログラムを見てください。
f = open("./my_document.txt", mode="w", encoding="utf-8")
f.write(str(1.0))
f.close()
このプログラムではファイルを開き、そこに1,0という値を書き込み、ファイルを閉じるというとても単純なプログラムです。このプログラムを例に順を追って解説していきます。
ファイルを開く
まず1行目でファイルを開き、そのファイルオブジェクトをfという変数に格納しています。open関数は3つの引数を取ります。
open(ファイルのパス, ファイルのモード, エンコード)
ここでは、カレントディレクトリのmy_document.txtというファイル名でファイルを開いています。mode=”w”とすると、書き込みモードで開きます。1点注意点としては、もし既にmy_document.txtというファイルがあり、何かファイルが書き込まれている場合、上書きされてしまいます。
このような上書きを防ぐには、mode=”a+”を指定すると良いでしょう。mode=”a+”ではファイルが存在しない場合はファイルを作成し、存在する場合は末尾に追記するというモードになります。
encodingは無くても動きますが、よく使われるのはutf-8やshift_jisあたりです。
ファイルに書き込む
ファイルが開かれた状態で、f.writeを使って、ファイルに文字列を書き込みます。f.writeは数値などのデータ型だとエラーになりますので、ここではstr関数を使って、1.0を文字列に変換し、書き込んでいます。
ファイルを閉じる
忘れてはいけないのが、ファイルを閉じるということです。f.closeでファイルを閉じることができます。なぜ、忘れてはいけないかというとファイルを閉じて初めて書き込んだ内容がファイルに反映されるためです。このため、f.closeする前にファイルを開いても何も書き込まれていない状態になります。
Pythonでファイルを開き、読み取る
読み取りは書き込みとほぼ同じ手続きを踏みます。次のプログラムを見てください。
f = open("./my_document.txt", mode="r", encoding="utf-8")
f.read()
f.close()
違いはといえば、mode=”r”に代わっている点、f.writeではなく、f.readになっている点の2つです。それ以外は同じです。mode=”r”を指定すると、読み取り専用のモードになります。
f.readはファイルの中身を一気に読み込ます。この為、ファイル容量が大きすぎる場合は問題が生じます。このため、ここで説明するファイル入出力は小規模なファイルに限ります。大規模な計算結果などのファイル容量の大きなものはHDFなどで入出力するため、h5pyを使用します。
with openでファイルの閉じ忘れを防ぐ
ファイルの読み込みでも書き込みでも最後に必ずf.closeでファイルを閉じる必要がありました。ただ、ファイルを閉じ忘れる可能性もゼロとは言い切れません。そこで、使うのが次に説明するwith openでファイルを開く方法です。次のプログラムを見てください。
with open("./my_document.txt", mode="r", encoding="utf-8") as f:
f.read()
with open(…) as f:のように開き、インデントされたブロック中にファイルを開いた後の操作を記述します。こうすると、with openのブロックが終わるとファイルを自動的に閉じてくれるのです。このため、Pythonでファイルを開く際には基本的にこのwith openでファイルを開くようにしましょう。
まとめ
この記事ではPythonにおけるファイル入出力について学びました。以下に、纏めておきます。
# ファイルを作成し、書き込む。a+ではファイルがある場合は末尾に追加
f = open("./my_document.txt", mode="a+", encoding="utf-8")
f.write(str(1.0))
f.close()
# 作成したファイルを読み取る
f = open("./my_document.txt", mode="r", encoding="utf-8")
f.read()
f.close()
# withステートメントでブロックが終わると自動でファイルを閉じてくれる
with open("./my_document.txt", mode="r", encoding="utf-8") as f:
f.read()
Tips: 大規模なファイルの入出力は?
この記事で紹介したファイル入出力は科学技術計算では小規模なファイル向けの使い方になります。例えば、計算条件のファイルを読み込んだり、計算途中の簡単なサマリーをログとして出力するなどの使い方がメインになるかと思います。
それでは大きなファイルの場合にどうするのかということになります。その前に、そもそもファイル容量の大きなファイルとはどんなファイルなのかを考えると、計算の生の数値データが該当します。
例: 100 x 100 x 100のジオメトリで10万ステップ分の3次元のベクトルデータ(vx, vy, vz)
こういった比較的大きなサイズの数値データの場合はHDFフォーマットで出力するのがおススメです。Pythonではh5pyというライブラリを使うことで、簡単にHDFフォーマットで出力できます。詳しくはこちらの記事も併せてご覧ください。
最新記事 by t-tetsuya (全て見る)
- 【GPyOpt】Python x ベイズ最適化の基本をマスターしよう - 2020年12月29日
- Python print関数の基本の使い方 - 2020年12月10日
- Python関数の書き方の基本 - 2020年12月1日
・ファイルの読み込み、書き込み
・読み込み専用、書き込み専用などのモード
について理解することができます。