Python でテンポラリファイルを作成する(tempfile)

一時的なファイルやディレクトリを作成するには tempfile モジュールを使う。プログラム終了時やコンテキスト終了時に自動的に削除されるため、後処理を気にする必要がない。

一時ファイルを作成する

tempfile.NamedTemporaryFile() を使うと、名前付きの一時ファイルを作成できる。

import tempfile

with tempfile.NamedTemporaryFile(mode='w', delete=True) as f:
    f.write('一時的なデータ')
    print(f.name)  # /tmp/tmpxxxxxx のようなパス
# with を抜けると自動削除される

delete=True(デフォルト)の場合、ファイルを閉じると自動的に削除される。delete=False にすると、手動で削除するまでファイルが残る。

一時ディレクトリを作成する

tempfile.TemporaryDirectory() を使うと一時ディレクトリを作成できる。

import tempfile

with tempfile.TemporaryDirectory() as tmpdir:
    print(tmpdir)  # /tmp/tmpxxxxxx
    # このディレクトリ内で作業
# with を抜けると中身ごと自動削除される

一時ディレクトリ内に複数のファイルを作成して処理する場合に便利だ。

一時ファイルのパスだけを取得する

ファイルを開かずにユニークな一時ファイル名だけが欲しい場合は tempfile.mkstemp() を使う。

import tempfile
import os

fd, path = tempfile.mkstemp(suffix='.txt')
print(path)  # /tmp/tmpxxxxxx.txt

# ファイルディスクリプタを使って書き込み
os.write(fd, b'data')
os.close(fd)

# 使い終わったら手動で削除
os.remove(path)

mkstemp() は自動削除されないため、手動で削除する必要がある。

一時ファイルの保存場所を指定する

デフォルトではシステムの一時ディレクトリ(/tmp など)に作成されるが、dir 引数で保存場所を指定できる。

import tempfile

with tempfile.NamedTemporaryFile(dir='./cache') as f:
    print(f.name)  # ./cache/tmpxxxxxx

suffix と prefix を指定する

ファイル名にサフィックス(拡張子)やプレフィックスを付けることもできる。

import tempfile

with tempfile.NamedTemporaryFile(suffix='.csv', prefix='data_') as f:
    print(f.name)  # /tmp/data_xxxxxx.csv