HOWTO · Python

Python で一時ファイルを作成する

この記事では、tempfile ライブラリ関数の 4つのサブ関数(TemporaryFile、NamedTemporaryFile、mkstemp、TemporaryDirectory) について説明します。 概念の理解を容易にするために、各セクションには適切なプログラムが用意されています。

この記事では、Python で一時ファイルとディレクトリを作成する方法について説明します。 Python の一時ファイルは、tempfile モジュールを使用して生成されます。

この記事では、TemporaryFileNamedTemporaryFilemkstemp、および TemporaryDirectory という、tempfile の 4つのサブ関数についても説明します。

tempfile モジュールを使用して Python で一時ファイルを作成する

この関数は、Python で安全に作成された一時ファイルを作成し、一時的に利用できるファイルに似たストレージ領域を返します。 オブジェクトが閉じられるとすぐに破棄されます (オブジェクトがガベージ コレクションされるときの暗黙的な閉じを含みます)。

この関数を使用して Python で一時ファイルを作成する構文は次のとおりです。

file = tempfile.TemporaryFile()
# 	OR
file = tempfile.TemporaryFile(
    mode="w+b",  # Remains as Default mode if not mentioned
    suffix=None,  # adds a suffix to file name
    prefix=None,  # adds prefix to file name
    # etc.
)

Python のこの一時ファイルは、コンテキストの完了 (with ブロック) またはファイル オブジェクトの破棄 file.close() の際にファイル システムから削除されます。 モード パラメータのデフォルト値は w+b であるため、新しいファイルは閉じずに読み書きできます。

バイナリ モードで動作し、保存されたデータに関係なく、すべてのシステムで一貫性を維持します。 バッファリング、エンコーディング、エラー、改行などの追加の用語は、Python 組み込み関数 open() の一部であり、パラメーター内で使用できます。

以下のプログラムは、TemporaryFile() を使用して Python で一時ファイルを作成する方法を示しています。

コードの最初の行は、ライブラリ パッケージ tmpfile をインポートします。 tempfile.TemporaryFile() 関数を使用して一時ファイルを作成する変数 filepath が作成されます。

データは filepath.write() 関数を使用して一時ファイル内に書き込まれます。 このパラメーターはバイト型の値のみを受け取るため、文字列の前にリテラル b が追加されます。

filepath.seek(0) 関数は、長さ 0 から始まるファイル ストリームにファイルをロードします。

出力変数 filepath は、オブジェクトのアドレスを示します。 一時ファイルのファイル名を確認するために、関数 filepath.name() が表示されます。

関数 filepath.read() は、一時ファイルからデータを読み取り、出力します。 最後に、filepath.close() を使用して一時ファイル オブジェクトを解放します。

import tempfile

filepath = tempfile.TemporaryFile()

filepath.write(b"Writing some stuff")
filepath.seek(0)

print(filepath)
print(filepath.name)

print(filepath.read())
filepath.close()

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x00000285D92DAC50>
C:\Users\WIN10~1\AppData\Local\Temp\st.cq3d03ezloraine
b'Hello world!'

Process finished with exit code 0

別のプログラムを見てみましょう。

ここで、変数 filepathTemporaryFile サブ関数の 3つのパラメーターを使用します。 モードは、読み取りと書き込みを表す w+b として設定されます。

また、接頭辞 st. また、ファイル名には loarine という接尾辞が追加されます。 データはテンポラリに書き込まれ、ファイル名が出力されます。

import tempfile

filepath = tempfile.TemporaryFile(
    mode="w+b",
    prefix="st.",  # adds prefix to file name
    suffix="loraine",  # adds a suffix to file name
)

filepath.write(b"Hello world!")

print(filepath.name)

filepath.close()

ファイル名に接頭辞と接尾辞が追加されていることがわかります。

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.kepthvu_loraine

Process finished with exit code 0

プログラムの終了時に、一時ファイルが明示的に閉じられていることがわかります。 これを行うと、ファイルは閉じられますが、削除されません。

ファイルを閉じた後でもファイル名を表示できますが、その内容を読み込むことはできません。

Python で閉じた一時ファイルの読み取りまたは書き込みを行うと、通常のファイルと同じように値エラーが発生します。

import tempfile

filepath = tempfile.TemporaryFile(
    mode="w+b",
    prefix="st.",  # adds prefix to file name
    suffix="loraine",  # adds a suffix to file name
)

filepath.write(b"Hello world!")

filepath.close()

print(filepath.name)

filepath.write(b"Hello world!")

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.f7n0s5a6loraine
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    filepath.write(b'Hello world!')
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: write to closed file

Process finished with exit code 1

Python で名前付き一時ファイルを作成する

この関数と TemporaryFile() の唯一の違いは、この関数がファイル システム内で確実にファイル名を持つことです。 この名前は、オブジェクトが返されるときに name 属性で見つけることができます。

UNIX では、前のファイルが既に開いていても、同じ名前を使用して別の一時ファイルを開くことができますが、Windows では禁止されています。

デフォルトでは、Python の一時ファイルは閉じるとすぐに削除されるように設定されていますが、delete = False を設定することでオフにすることができます。 通常のファイルと同様に、このファイルのようなオブジェクトはステートメントで使用できます。

このサブ関数を使用する構文は次のとおりです。

tmp = tempfile.NamedTemporaryFile()
# 	OR
tmp = tempfile.NamedTemporaryFile(mode="w+b", delete=False, suffix=None, prefix=None)

Python で名前付き一時ファイルを作成するには、次のプログラムを使用します。

このプログラムは、ここに 2つのライブラリ パッケージ、ostempfile をインポートします。 変数 tempo_file を使用して一時ファイルが作成され、delete パラメータが False に設定され、プレフィックスとサフィックスが提供されます。

try ブロック内で、ファイル オブジェクトは print(tempo_file) を使用して出力されます。 次に、print(tempo_file.name) を使用してファイル名を出力します。

関数 tempo_file.write() は、この一時ファイル内に書き込むために使用されます。

finally ブロック内で、ファイルは tempo_file.close() を使用して閉じられます。 次に、os.unlink() 関数を使用して、ファイルの名前がファイル オブジェクトからリンク解除されます。

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=False, prefix="Ice", suffix="cream")
try:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b"Peacock is national bird of India")
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x000001DE90935C18>
C:\Users\WIN10~1\AppData\Local\Temp\Icez5eghui0cream

Process finished with exit code 0

delete パラメータは、上記のプログラムで False になっています。つまり、暗黙的に閉じられていない場合、開いたままになります。 delete パラメータが True に設定されている場合、ファイルを閉じた後にファイル名にアクセスすることはできません。

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=True)
try:
    print(tempo_file.name)
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

print(tempo_file.name)

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/ain.py"
C:\Users\WIN10~1\AppData\Local\Temp\tmp6j3xxjzr
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    os.unlink(tempo_file.name)
FileNotFoundError: [WinError 2] The system cannot find the file specified:'C:\\Users\\WIN10~1\\AppData\\Local\\Temp\\tmp6j3xxjzr'

Process finished with exit code 1

with ブロックは自動的にファイルを閉じるので便利です。

import tempfile

with tempfile.TemporaryFile(delete=True) as tempo_file:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b"Peacock is national bird of India")

print(tempo_file.read())

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x0000027EB1C09390>
C:\Users\WIN10~1\AppData\Local\Temp\tmpzk_gpkau
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 11, in <module>
    print(tempo_file.read())
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: read of closed file

Process finished with exit code 1

mkstemp 関数を使用して Python で一時ファイルを作成する

この関数は、Python で一時ファイルを作成するために実行可能な最高レベルのセキュリティを提供します。 ファイルを作成したユーザー ID のみが、ファイルの読み取りと書き込みのアクセス権を持っています。

プラットフォームが許可ビットを使用してファイルが実行可能かどうかを判断している場合、誰もそのファイルを実行できません。 子プロセスでさえ、ファイル記述子を継承しません。

mkstemp に使用される構文は次のとおりです。

tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)

関数 TemporaryFile() とは異なり、mkstemp() を使用する場合、プログラマは暗黙的に一時ファイルを削除する必要があります。 この関数には、prefixsuffix、および dir パラメーターの固有の役割があります。

それらを見てみましょう。

None に設定されていない場合、ファイル名は特定の接尾辞で終わります。 そうでなければ、存在しません。 mkstemp() はファイル名とサフィックスの間にドットを配置しないため、必要に応じてサフィックスの先頭にドットを配置する必要があります。

None の代わりにプレフィックスがある場合、ファイル名はプレフィックスで始まります。 それ以外の場合は、デフォルトのプレフィックスが使用されます。 gettempprefix() または gettempprefixb() から返された値は、適切と思われるプログラムのデフォルトとして機能します。

dir には、一時ファイルのディレクトリが格納されます。 dirNone に設定されていない場合、指定されたディレクトリにファイルが作成されます。 それ以外の場合は、デフォルトのディレクトリが使用されます。

デフォルトのディレクトリはプラットフォームに依存します。

TMPDIRTEMP、または TMP 環境変数を変更することにより、アプリケーション ユーザーは、そのプラットフォーム固有のリストからのデフォルト ディレクトリの選択をオーバーライドできます。

suffixprefix、および dir は、None に設定されていない場合、すべて同じタイプでなければなりません。 これらがバイトの場合、返される名前は str ではなくバイトになります。

suffix=b を渡すと、デフォルトの動作ではなく、戻り値にバイトが強制されます。

テキストが指定され、True の場合、ファイルはテキスト モードで開かれます。 False に設定されている場合、システムはデフォルトでファイルをバイナリ モードで開きます。

次のプログラムは、mkstemp を使用して一時ファイルを作成します。 mkstemp 関数は 2つの引数を使用します。最初の引数はファイルの識別子で、2 番目の引数はファイル名です。

try ブロック内では、ファイルはそのハンドルを介して with ブロックを使用して開かれます。 次に、ファイル内にいくつかのデータが書き込まれます。

finally ブロック内では、ファイルは os.unlink(filename) を使用して暗黙的に削除されます。

import os
import tempfile

handle, filename = tempfile.mkstemp(suffix=".bat")
try:
    with os.fdopen(handle, "w") as f:
        f.write("signature")
        print(handle)
        print(filename)

finally:
    os.unlink(filename)

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
3
C:\Users\WIN10~1\AppData\Local\Temp\tmp1yvy9j_c.bat

Process finished with exit code 0

Python で一時ディレクトリを作成する

このクラスは一時ディレクトリを安全に作成します。 これらのオブジェクトは、with ブロックのようなコンテキスト マネージャーを使用して使用できます。

新しく形成された一時ディレクトリとその内容は、コンテキストの完了時または一時ディレクトリ オブジェクトの破棄時にメモリから削除されます。

返されたオブジェクトの name 属性には、取得可能なディレクトリ名が含まれています。 この名前は、返されたオブジェクトがコンテキスト マネージャーとして使用されるときに、with ステートメント (存在する場合) の as 句のターゲットに与えられます。

例えば:

with tempfile.TemporaryDirectory() as f:  # 'f' is the 'as' clause in this while statement
    print("Temporary directory is created", f)

cleanup() メソッドを呼び出すと、明示的にディレクトリが消去されます。 ignore cleanup errors が true の場合、明示的または暗黙的なクリーンアップ中に未処理の例外は無視されます。

残りの取り外し可能なアイテムは、ベスト エフォート技術を使用して破棄されます。

一時ディレクトリを作成するには、以下の Python プログラムを使用できます。

import tempfile

with tempfile.TemporaryDirectory() as f:
    print("Temporary directory is created", f)

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
Temporary directory is created C:\Users\WIN10~1\AppData\Local\Temp\tmp1gk3c5z8

Process finished with exit code 0

この記事では、Python の tempfile モジュールとそのサブ関数を使用して一時ファイルを作成する方法について説明しました。