👋

【Python】一時ファイル・デイレクトリの作成(tempfile)

2022/02/17に公開

tempfileモジュール

Pythonで一時ファイル・デイレクトリを作成する場合は、組み込のモジュールtempfileを使用すると便利です。
使い終わった後の自動削除方法(自動削除する/しおい)など目的に応じて使い分けられるように用意されていますので柔軟に利用することができます。

準備

tempfileモジュールをインポートします。

import tempfile

TemporaryFile()

TemporaryFile()を使って作成するファイルは、I/Oバッファ(一時的な記憶領域)上に作成され、オブジェクトを閉じたタイミングでシステム上から自動削除されます。

import tempfile

with tempfile.TemporaryFile(mode='w+') as t:
    t.write('hello')
    t.seek(0)
    print(t.read())
  1. withステートメントを使って、TemporaryFile()を読み書きモードで開く
  2. ファイルへhelloと記述
  3. seek()を使ってカーソルを先頭へ移動
  4. print()で一時ファイルの内容を出力

NamedTemporaryFile()

NamedTemporaryFile()は、TemporaryFile()とは異なり、一時的に物理ファイルを作成します。

import os
import tempfile

with tempfile.NamedTemporaryFile(delete=True) as t:
    print(t.name)
    with open(t.name, 'w+') as f:
        f.write('書込確認\n')
        f.seek(0)
        print(f.read())
	print('Close前: ', t.name, os.path.isfile(t.name))
    
print('Close後: ', t.name, os.path.isfile(t.name))
  1. withステートメントを使って、NamedTemporaryFile()を開く
    キーワード引数であるdelete=Trueは省略可能
  2. 作成された一時ファイルの格納先を保持するname属性をprint()で確認
  3. withステートメントを使って、作成した一時ファイルを開く
  4. writeで一時ファイルに書き込み
  5. seek()を使ってカーソルを先頭へ移動
  6. print()で一時ファイルの内容を出力
  7. ファイルクローズ前であるwithステートメント内でos.path.isfile()を使い、作成した一時ファイルの存在することを確認(True=存在)
  8. ファイルクローズ後であるwithステートメント外でos.path.isfile()を使って、作成した一時ファイルが存在しないことを確認(False=存在しない)
実行結果
書込確認
Close前:  /var/folders/k8/n4hh2wbn0vz0hmfglrqh4v2c0000gn/T/tmp4lxgdhlc True
Close後:  /var/folders/k8/n4hh2wbn0vz0hmfglrqh4v2c0000gn/T/tmp4lxgdhlc False

TemporaryDirectory()

TemporaryDirectory()では、一時ディレクトリを作成します。
作成された一時ディレクトリは閉じた時点で自動削除されます。

with tempfile.TemporaryDirectory() as td:
    print(td)
    print('Close前: ', td, os.path.isdir(td))

print('Close前: ', td, os.path.isdir(td))
  1. withステートメントを使って、TemporaryDirectory()を開く
  2. print()を使って、作成された一時ディレクトリのパスを表示
  3. ファイルクローズ前であるwithステートメント内でos.path.isdir()を使い作成した一時ディレクトリが存在することを確認(True=存在)
  4. ファイルクローズ外であるwithステートメント外でos.path.isdir()を使い作成した一時ディレクトリが存在しないことを確認(False=存在しない)

mkdtemp()

TemporaryDirectory()のように自動削除されると困る(withステートメント外でも使用したい)場合は、mkdtemp()を使用します。

  1. mkdtemp()を使って一時ディレクトリを作成
  2. print()を使って、作成された一時ディレクトリのパスを出力

Discussion