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()

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら