Python TemporaryDirectoryとは?一時フォルダを自動で削除する方法
Pythonのtempfile.TemporaryDirectory()は、一時フォルダを作り、使い終わったら中身ごと自動で削除する仕組みです。
複数のファイルを作る作業に向いており、tempfileの中で最も出番が多い機能です。
TemporaryDirectoryの基本的な使い方
import tempfile, os
from pathlib import Path
with tempfile.TemporaryDirectory() as d:
print("パス:", d)
print("存在する:", os.path.isdir(d))
p = Path(d) / "work.txt"
p.write_text("データ", encoding="utf-8")
print("中のファイル:", os.listdir(d))
print("抜けると消える:", os.path.isdir(d))
実行結果(例):
パス: /var/folders/yb/.../T/tmpy5hhnbz8
存在する: True
中のファイル: ['work.txt']
抜けると消える: False
asで受け取るのはフォルダのパス(文字列)です。フォルダオブジェクトではありません。
中身が何個あっても丸ごと消える
import tempfile, os
from pathlib import Path
with tempfile.TemporaryDirectory() as d:
base = Path(d)
(base / "a.txt").write_text("A", encoding="utf-8")
(base / "b.txt").write_text("B", encoding="utf-8")
(base / "sub").mkdir()
(base / "sub" / "c.txt").write_text("C", encoding="utf-8")
print("作ったもの:", sorted(os.listdir(d)))
print("残っている:", os.path.isdir(d))
実行結果:
作ったもの: ['a.txt', 'b.txt', 'sub']
残っている: False
サブフォルダごと削除されます。1つずつ消す必要はありません。
これがNamedTemporaryFile()との最大の違いです。ファイル1個ずつ管理するより、作業場所をまるごと借りるほうが圧倒的に楽になります。
例外が起きても削除される
import tempfile, os
from pathlib import Path
try:
with tempfile.TemporaryDirectory() as d:
(Path(d) / "a.txt").write_text("x", encoding="utf-8")
raise ValueError("失敗")
except ValueError:
print("残っている:", os.path.isdir(d))
実行結果:
残っている: False
途中で処理が中断してもゴミが残りません。手書きのos.makedirs()+shutil.rmtree()では、try-finallyを自分で書く必要があります。
名前を調整する|prefix・suffix・dir
import tempfile, os
with tempfile.TemporaryDirectory(prefix="myapp_", suffix="_work") as d:
print(os.path.basename(d))
実行結果(例):
myapp_nmtk9p5i_work
| 引数 | 役割 |
|---|---|
prefix |
名前の先頭に付ける |
suffix |
名前の末尾に付ける |
dir |
作る場所を指定する |
prefixにアプリ名を入れておくと、もし消し残しが起きたとき原因を特定しやすくなります。真ん中のランダムな文字列はtempfileが付けるので、名前は必ず一意になります。
実践例|ダウンロードして展開して処理する
import tempfile, zipfile
from pathlib import Path
def process_zip(zip_path):
with tempfile.TemporaryDirectory() as d:
with zipfile.ZipFile(zip_path) as z:
z.extractall(d)
results = []
for p in sorted(Path(d).glob("*.txt")):
results.append(p.read_text(encoding="utf-8"))
return results
展開したファイルは関数を抜けた時点ですべて消えます。何個入っていたかを気にする必要がありません。
「作業用の場所を借りて、終わったら返す」——この形がTemporaryDirectory()の典型的な使い方です。
実践例|テストで使う
import tempfile, unittest
from pathlib import Path
class TestSave(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.TemporaryDirectory()
self.dir = Path(self.tmp.name)
def tearDown(self):
self.tmp.cleanup()
def test_save(self):
path = self.dir / "out.txt"
path.write_text("結果", encoding="utf-8")
self.assertEqual(path.read_text(encoding="utf-8"), "結果")
withを使わない場合は、.nameでパスを取り、.cleanup()で削除します。テストのように「準備」と「後片付け」が別メソッドに分かれる場面で使う形です。
テストごとにまっさらなフォルダが用意されるため、前のテストの結果が残る事故を防げます。
Python 3.10以降は削除エラーを無視できる
with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as d:
...
Windowsでは、別のプロセスがファイルを開いていると削除に失敗することがあります。既定ではそこで例外になりますが、この引数を付けると無視して進みます。
本処理が成功しているのに後片付けだけで落ちる、という事態を避けられます。
shutil.rmtreeとの比較
import tempfile, shutil, os
d = tempfile.mkdtemp()
try:
...
finally:
shutil.rmtree(d)
同じことを手で書くとこうなります。TemporaryDirectory()ならtry-finallyが不要です。
| 場面 | 使うもの |
|---|---|
| 処理が終われば消してよい | TemporaryDirectory() |
| 削除のタイミングを自分で決めたい | mkdtemp()+shutil.rmtree() |
| プログラム終了後も残したい | mkdtemp() |
削除を自分で管理する方法は「Python mkstemp()・mkdtemp()とは?削除を自分で管理する方法」で解説しています。
TemporaryDirectoryのまとめ
TemporaryDirectory()は一時フォルダを作り、抜けると中身ごと削除するasで受け取るのはパスの文字列- サブフォルダを含めて丸ごと消える
- 例外が起きても削除される
prefixにアプリ名を入れると調査しやすいwithを使わないときは.nameと.cleanup()- 削除を自分で決めたいなら
mkdtemp()




