Python で一時ファイルを作成する
-
tempfile
モジュールを使用して Python で一時ファイルを作成する - Python で名前付き一時ファイルを作成する
-
mkstemp
関数を使用して Python で一時ファイルを作成する - Python で一時ディレクトリを作成する
この記事では、Python で一時ファイルとディレクトリを作成する方法について説明します。 Python の一時ファイルは、tempfile
モジュールを使用して生成されます。
この記事では、TemporaryFile
、NamedTemporaryFile
、mkstemp
、および 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
別のプログラムを見てみましょう。
ここで、変数 filepath
は TemporaryFile
サブ関数の 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つのライブラリ パッケージ、os
と tempfile
をインポートします。 変数 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()
を使用する場合、プログラマは暗黙的に一時ファイルを削除する必要があります。 この関数には、prefix
、suffix
、および dir
パラメーターの固有の役割があります。
それらを見てみましょう。
None
に設定されていない場合、ファイル名は特定の接尾辞で終わります。 そうでなければ、存在しません。 mkstemp()
はファイル名とサフィックスの間にドットを配置しないため、必要に応じてサフィックスの先頭にドットを配置する必要があります。
None
の代わりにプレフィックスがある場合、ファイル名はプレフィックスで始まります。 それ以外の場合は、デフォルトのプレフィックスが使用されます。 gettempprefix()
または gettempprefixb()
から返された値は、適切と思われるプログラムのデフォルトとして機能します。
dir
には、一時ファイルのディレクトリが格納されます。 dir
が None
に設定されていない場合、指定されたディレクトリにファイルが作成されます。 それ以外の場合は、デフォルトのディレクトリが使用されます。
デフォルトのディレクトリはプラットフォームに依存します。
TMPDIR
、TEMP
、または TMP
環境変数を変更することにより、アプリケーション ユーザーは、そのプラットフォーム固有のリストからのデフォルト ディレクトリの選択をオーバーライドできます。
suffix
、prefix
、および 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
モジュールとそのサブ関数を使用して一時ファイルを作成する方法について説明しました。