この記事では、Python で一時ファイル(temporary file)を使う方法を解説します。
Python で一時ファイルを扱うには tempfile
モジュール を使うと簡単です。tempfile
モジュール は、標準ライブラリなのでインポートするだけで使用可能です。
import tempfile
Linktempfile --- 一時ファイルやディレクトリの作成 — Python ドキュメント
それでは、一時ファイルを使う方法を見ていきましょう。
一時ファイルを生成する
一時ファイルを扱うには tempfile.TemporaryFile()
クラス を使います。 戻り値に閉じることですぐに削除されるファイルオブジェクトを返します。
tempfile.TemporaryFile(mode='w+b', buffering=- 1, encoding=None,
newline=None, suffix=None, prefix=None,
dir=None, *, errors=None)
定義されている引数は、ほとんど open()関数 と同じである。
open()
関数 と異なる引数として以下のようなものが定義されている。以下の引数を指定する場合、同じ型の値を渡す必要がある。
suffix | 指定された場合、ファイル名に接尾辞として追加される。 |
---|---|
prefix | 指定された場合、ファイル名に接頭辞として追加される。 |
dir | 指定された場合、そのディレクトリ下にファイルが作成される。 |
試しに、一時ファイルに適当な文字を読み書きしてみる。
import tempfile
# 一時ファイルの生成
fp = tempfile.TemporaryFile()
# 一時ファイルに書き込み
fp.write(b'abc')
fp.write(b'def')
# ファイルオブジェクトの位置を先頭に移動
fp.seek(0)
# 一時ファイルの中身の取得・出力
print(fp.read())
# 一時ファイルを閉じる
fp.close()
実行結果
b'abcdef'
簡単に一時ファイルを使うことができました。
一時ファイルの名前を使いたい
一時ファイルの名前を取得したい場合は NamedTemporaryFile()
を使う。
tempfile.NamedTemporaryFile(mode='w+b', buffering=- 1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None)
ファイル名は、ファイルオブジェクトの name
属性 からアクセスできます。作成される一時ファイルの名前は環境によって異なります。
import tempfile
# 名前付きで一時ファイルを生成
fp = tempfile.NamedTemporaryFile()
# 一時ファイルの名前の取得・出力
print(fp.name)
# 一時ファイルを閉じる
fp.close()
実行結果
/var/folders/m9/9_kjpgcn70jbb0s93r9xhzh40000gr/T/tmpte8ad4n8
delete
引数 に False
を指定することでファイルを閉じてもすぐには消されないようにできる。
import tempfile
import os
# 名前付きで一時ファイルを生成
fp = tempfile.NamedTemporaryFile(delete=False)
# ファイルの存在確認
print(os.path.isfile(fp.name))
# 一時ファイルを閉じる
fp.close()
# ファイルの存在確認
print(os.path.isfile(fp.name))
実行結果
True
True
posix
ではない または cygwin
である場合、TemporaryFile
には、NamedTemporaryFile
が代入されるので注意してください。
if _os.name != 'posix' or _sys.platform == 'cygwin':
# On non-POSIX and Cygwin systems, assume that we cannot unlink a file
# while it is open.
TemporaryFile = NamedTemporaryFile
Linkcpython/tempfile.py at 3.10 · python/cpython · GitHub
with文を使う
どちらの関数も with
文 で扱うことができます。
import tempfile
with tempfile.TemporaryFile() as fp:
fp.write(b'Hello')
fp.seek(0)
print(fp.read())
with tempfile.NamedTemporaryFile() as fp:
print(fp.name)
実行結果
b'Hello'
/var/folders/m9/9_kjpgcn70jbb0s93r9xhzh40000gr/T/tmpvxy1g7tv
close()
し忘れがなくなるので安全です。