Python PR

【Python】一時ファイルを扱う方法を解説

記事内に商品プロモーションを含む場合があります

この記事では、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() し忘れがなくなるので安全です。

自作クラスをwith文で使う方法【コンテキストマネージャ】