ここではPythonの標準ライブラリのtempfileモジュールの使い方について見ていこうと思います。
これまでのプログラミング作業では実際のファイルやディレクトリを作って、書き込んだり読み込んだりしていました。このtempfileモジュールを使えば、Pythonがメモリ(I/Oバッファ)上に一時的なファイルやディレクトリを作ってくれます。使い終わったら自動的に消してくれるので一時的に利用するときなどに便利です。
では、tempfileモジュールを見ていきましょう。
tempfileモジュール
tempfileモジュールをインポートして使います。
import tempfile
このモジュールを使って、一時ファイルに書き込んでみましょう。
TemporaryFile()
TemporaryFile()は、一時的な記憶領域として使うことができます。I/Oバッファ上に作られているだけなので、オブジェクトは閉じられるとすぐにシステムから削除されます。
次のようなコードを書いてみます。
import tempfile
with tempfile.TemporaryFile(mode='w+') as tf:
tf.write('Hello, Python!')
tf.seek(0)
print(tf.read())
withステートメントを使って、TemporaryFile()をmodeを書き込みモードにしてtfとして開いています。write()でHello, Python!と書き込んで、seek(0)で先頭行に戻り、read()で読み込んだものをprintで表示します。
これを実行してみます。(実行ファイル名をtempfile_iperation.pyにしてAtomでターミナルから実行しています)
Hello, Python!と出力されました。(余談ですが、Hello, Python!とか書くのはちょっと芸が無いなと感じてしまいますw)
NamedTemporaryFile()
次は実際に一時ファイル名を持つ形で一時的な記憶領域を作ります。それには、NamedTemporartFile()を使います。
name属性でファイルのパスを見ることができます。
import tempfile
with tempfile.NamedTemporaryFile(delete=False) as tf:
print(tf.name)
with open(tf.name, 'w+') as f:
f.write('Hello, tempfile!\n')
f.seek(0)
print(f.read())
NamedTemporaryFIle()を使ってdelete=Falseで一時ファイルをtfとして作ります。nameを使うとファイルのパスがわかるので、一応見ておくためにprintで出力してみます。これをwithステートメントのopenで開く時にnameでパスを指定し、書き込みモードでfとして開きます。ここではwriteでHello, tempfile!と書き込み、seek(0)で先頭に戻って、read()で読み込んだものをprintで出力します。
書き込んがものが表示されました。(\nを記入しているので、最後に改行がなされて1行空いています)
一時ファイルのパスも最初に表示しているので、どこにファイルがあるかわかりますね。実際、これは私のMac上のこの位置の隠しフォルダの中にあり、電源を落とすまでファイルは存在します。
ターミナルからcatコマンドを使ってこのパスの中身を見ると次のようになります。
上記と同じ中身を確認することができました。
TemporaryDirectory()
次はディレクトリを一時的に作ってみます。それにはTemporaryDirectory()を使います。
import tempfile
with tempfile.TemporaryDirectory() as td:
print(td)
TemporaryDirectory()をtdとして作っています。printで出力します。
実行するとこうなります。
一時ディレクトリが作成されたのがわかります。このディレクトリを作っていろんな操作をすればいいのですが、この場合はprintで出力した時点で、作業は終了しています。withステートメントですから、ファイルも閉じている状態です。
ですからlsコマンドを使ってディレクトリを見てみても次のとおりです。
No such file or directoryということで、終了と同時に削除されているのがわかります。
mkdtemp()
では一時フォルダとしてしばらく利用するにはどうすればいいのかというと、mkdtemp()を使います。
import tempfile
temp_mydir = tempfile.mkdtemp()
print(temp_mydir)
temp_mydirとしてmkdtemp()をオブジェクト化します。printで出力すると、次のようにフォルダのパスが表示されます。
このパスを、ターミナルのlsコマンド(ここではls -alで詳細表示しました)を使ってみてみます。
一時ディレクトリが存在することがわかりました。
これはパソコンの電源を落とすまで削除されないので、引き続きこのフォルダを利用して作業ができますし、電源を落とす前に明示的にフォルダを削除することもできます。
まとめ
ここではPythonの標準ライブラリであるtempfileモジュールの使い方をみてきました。
公式ドキュメントは次のとおりです。
ここでは、TemporaryFile()、NamedTemporaryFile()、TemporaryDirectory()、mkdtemp()を使って一時ファイル、一時ディレクトリを作ってみました。
公式ドキュメントにはこれ以外にもメソッドがありますが、多少の目的や機能の違い以外はここで扱ったものとほぼ同じことを行います。