pythonで一時ファイルや一時ディレクトリを使用するには、tempfileモジュールを使用します。このモジュールは、安全かつ効率的に一時的なファイルやディレクトリを作成・管理するための機能を提供します。
一時ファイル
TemporaryFile()
次に示すのは、最も基本的な一時ファイルの作成方法です。ファイルはバイナリモードでオープンされ、ファイルディスクリプタを返します。ファイルが閉じられるかプログラムが終了すると、自動的に削除されます。
import tempfile
with tempfile.TemporaryFile(mode='w+t', encoding='utf-8') as temp_file:
# ファイルに書き込み
temp_file.write("これは一時ファイルに書かれたテキストです。\n")
temp_file.write("もう一行のデータ。\n")
# ファイルの先頭に戻る
temp_file.seek(0)
# ファイルから読み込み
content = temp_file.read()
print("一時ファイルの内容:")
print(content)
mode=’w+t’ は、テキストモードで読み書き可能であることを示します。
delete=True は、ファイルが閉じられたときに自動的に削除されることを示します(デフォルト)
encoding 引数でエンコーディングを指定できます。
with ブロックを抜けた時点で、一時ファイルは自動的に閉じられ削除されます。
NamedTemporaryFile()
NamedTemporaryFile()は、ファイルシステム上に実際に名前を持つ一時ファイルを作成したい場合に便利です。このファイルはパスを持っており、他のプロセスからアクセスすることも可能です(ただし、推奨されません)。ファイルが閉じられると削除されます。
import tempfile
import os
with tempfile.NamedTemporaryFile(mode='w+t', encoding='utf-8', delete=False) as temp_file:
# ファイル名を取得
temp_file_name = temp_file.name
# ファイルに書き込み
temp_file.write("これは名前付き一時ファイルに書かれたテキストです。\n")
temp_file.write("一行追加。\n")
# 残った一時ファイルから読み込み
with open(temp_file_name, encoding='utf-8'):
print(f"一時ファイル名: {temp_file_name}")
content = f.read()
print(content)
この例ではあえて delete=False を指定したので、with ブロックを抜けてもファイルは削除されません。したがって、手動で削除する必要があります。このコードでは、作成されたディレクトリとファイルが、ブロックを抜けた後でも残っています。
一時ディレクトリ
一時ディレクトリを作成するには tempfile.TemporaryDirectory()
を使います。こちらも閉じられると自動的に削除されます。
import tempfile
with tempfile.TemporaryDirectory() as temp_dir:
print(f"一時ディレクトリのパス: {temp_dir}")
# 一時ディレクトリ内にファイルを作成
temp_file_path = f"{temp_dir}/example.txt"
with open(temp_file_path, "w") as f:
f.write("Hello, Temporary Directory!")
# 作成したファイルを確認
with open(temp_file_path, "r") as f:
print(f.read())
# withブロックを抜けるとディレクトリは削除される
まとめ
with
ステートメントの使用: 一時ファイルや一時ディレクトリを使用する際は、可能な限りwith
ステートメントを使用します。これによって、ファイルやディレクトリが確実に閉じられ、適切にクリーンアップされることが保証されます。- 自動削除の利用: ほとんどの場合、
tempfile.TemporaryFile()
やtempfile.TemporaryDirectory()
のデフォルトの自動削除動作に任せるのが最も安全で簡単です。 - 一時ファイルの場所:
tempfile
モジュールは、OSが提供する一時ディレクトリの場所に一時ファイルを作成します(例: Linuxでは/tmp
、Windowsでは%TEMP%
)。必要ならtempfile.gettempdir()
で確認できます。
コメント