PYTHON MEBY

Pythonで一時ファイル・一時ディレクトリを作成(tempfile)

この記事では、Pythonのtempfileモジュールを使って一時ファイルや一時ディレクトリを作成する方法を説明します。安全で効率的な一時ファイルの取り扱いを学びます。

目次

一時ファイルの作成

一時ファイルを作成するには、`tempfile.NamedTemporaryFile()` 関数を使用します。この関数は、自動的に削除される一時ファイルオブジェクトを返します。

import tempfile
# 一時ファイルを作成する
f = tempfile.NamedTemporaryFile()
# ファイル名を表示
print(f.name)
# ファイルに書き込む(例)
f.write(b'This is a temporary file.')
# ファイルを閉じる(自動的に削除される)
f.close()

`delete=False` オプションを指定すると、ファイルが自動的に削除されません。手動で削除する必要があります。

import tempfile
# 自動削除しない一時ファイルを作成する
f = tempfile.NamedTemporaryFile(delete=False)
print(f.name)
f.close()
# 手動で削除する
import os
os.remove(f.name)

`suffix` オプションでファイル名に拡張子を付けることができます。

import tempfile
f = tempfile.NamedTemporaryFile(suffix='.txt')
print(f.name)
f.close()

一時ディレクトリの作成

一時ディレクトリを作成するには、`tempfile.TemporaryDirectory()` 関数を使用します。この関数は、コンテキストマネージャーとして使用できます。

import tempfile
# 一時ディレクトリを作成する
with tempfile.TemporaryDirectory() as tmpdirname:
    print(f'Temporary directory created at: {tmpdirname}')
    # ディレクトリ内で操作を行う
    # ...
# ディレクトリは自動的に削除される

コンテキストマネージャーを使用しない場合は、`TemporaryDirectory()` でオブジェクトを作成し、`cleanup()` メソッドで削除する必要があります。

import tempfile
# 一時ディレクトリを作成する
td = tempfile.TemporaryDirectory()
print(f'Temporary directory created at: {td.name}')
# ...
td.cleanup()

名前の衝突回避

複数のプロセスが同時に一時ファイルを作成する場合、名前の衝突を避けるために、`tempfile.mkstemp()` や `tempfile.mkdtemp()` などの関数が役立ちます。

import tempfile
# 一時ファイルを作成し、ファイルディスクリプタとファイル名を返す
fd, name = tempfile.mkstemp()
# ファイルを閉じる
os.close(fd)
print(name)
# 手動で削除する
os.remove(name)
import tempfile
# 一時ディレクトリを作成する
dir = tempfile.mkdtemp()
print(dir)
# 手動で削除する
import shutil
shutil.rmtree(dir)

クリーンアップ

一時ファイルや一時ディレクトリは、使用後は必ず削除してください。`tempfile` モジュールの関数は、多くの場合自動的に削除しますが、`delete=False` を指定した場合や、`TemporaryDirectory()` をコンテキストマネージャー以外で使用した場合は、手動で削除する必要があります。

  • 一時ファイルやディレクトリは、プログラムの終了時に自動的に削除されることが保証されているわけではありません。
  • 例外が発生した場合でも、クリーンアップ処理が実行されるように、`try...finally` ブロックを使用することをお勧めします。
  • `os.remove()`、`shutil.rmtree()` などの関数を使用して、ファイルを削除してください。

例:一時ファイルへのデータ書き込みと読み込み

一時ファイルにデータを書き込み、その後読み込む例です。

import tempfile

with tempfile.NamedTemporaryFile(mode='w+t') as f:
    f.write('Hello, temporary file!')
    f.seek(0)  # ファイルポインタを先頭に戻す
    data = f.read()

print(data) # 出力: Hello, temporary file!

tempfileモジュールの主要な関数

tempfileモジュールには、他にも様々な関数があります。必要に応じてドキュメントを参照してください。

  • `tempfile.NamedTemporaryFile()`:名前付き一時ファイルを作成する
  • `tempfile.TemporaryFile()`:名前なし一時ファイルを作成する
  • `tempfile.TemporaryDirectory()`:一時ディレクトリを作成する
  • `tempfile.mkstemp()`:名前付き一時ファイルを作成し、ファイルディスクリプタを返す
  • `tempfile.mkdtemp()`:一時ディレクトリを作成する
  • `tempfile.gettempdir()`:システムの一時ディレクトリのパスを取得する
  • `tempfile.gettempprefix()`:一時ファイル名のプレフィックスを取得する

関連記事