tempfile —一時ファイルとディレクトリを生成します—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/tempfile
移動先:案内検索

tempfile —一時ファイルとディレクトリを生成します

ソースコード: :source: `Lib / tempfile.py`



このモジュールは、一時ファイルとディレクトリを作成します。 サポートされているすべてのプラットフォームで動作します。 TemporaryFileNamedTemporaryFileTemporaryDirectory 、および PooledTemporaryFile は、自動クリーンアップを提供し、コンテキストマネージャーとして使用できる高レベルのインターフェイスです。 mkstemp()および mkdtemp()は、手動のクリーンアップが必要な低レベルの関数です。

すべてのユーザー呼び出し可能な関数とコンストラクターは、一時ファイルとディレクトリーの場所と名前を直接制御できるようにする追加の引数を取ります。 このモジュールで使用されるファイル名には、共有一時ディレクトリにそれらのファイルを安全に作成できるようにするランダムな文字列が含まれています。 下位互換性を維持するために、引数の順序はやや奇妙です。 わかりやすくするために、キーワード引数を使用することをお勧めします。

このモジュールは、次のユーザー呼び出し可能なアイテムを定義します。

tempfile.TemporaryFile(mode='w+b', buffering=- 1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

一時記憶域として使用できるファイルのようなオブジェクトを返します。 ファイルは、 mkstemp()と同じルールを使用して安全に作成されます。 閉じられるとすぐに破棄されます(オブジェクトがガベージコレクションされた場合の暗黙的な閉じを含む)。 Unixでは、ファイルのディレクトリエントリはまったく作成されないか、ファイルの作成直後に削除されます。 他のプラットフォームはこれをサポートしていません。 コードは、この関数を使用して作成された一時ファイルに依存してはなりません。ファイルシステムに名前が表示されているかどうかは関係ありません。

結果のオブジェクトは、コンテキストマネージャーとして使用できます(を参照)。 コンテキストが完了するか、ファイルオブジェクトが破棄されると、一時ファイルがファイルシステムから削除されます。

mode パラメーターのデフォルトは'w+b'であるため、作成されたファイルは閉じずに読み書きできます。 バイナリモードは、保存されているデータに関係なく、すべてのプラットフォームで一貫して動作するように使用されます。 バッファリングエンコーディングエラーおよび改行は、 open()と同様に解釈されます。

dirプレフィックス、およびサフィックスパラメーターは、 mkstemp()と同じ意味とデフォルトを持ちます。

返されるオブジェクトは、POSIXプラットフォーム上の真のファイルオブジェクトです。 他のプラットフォームでは、file属性が基になる真のファイルオブジェクトであるファイルのようなオブジェクトです。

os.O_TMPFILE フラグは、使用可能で機能している場合に使用されます(Linux固有、Linuxカーネル3.11以降が必要)。

バージョン3.5で変更: os.O_TMPFILE フラグが使用可能な場合に使用されるようになりました。

バージョン3.8で変更: エラーパラメーターが追加されました。

tempfile.NamedTemporaryFile(mode='w+b', buffering=- 1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None)

この関数は、 TemporaryFile()とまったく同じように動作しますが、ファイルがファイルシステムで表示される名前であることが保証されている点が異なります(Unixでは、ディレクトリエントリはリンク解除されません)。 その名前は、返されたファイルのようなオブジェクトのname属性から取得できます。 名前付き一時ファイルがまだ開いているときに、名前を使用してファイルを2回開くことができるかどうかは、プラットフォームによって異なります(Unixで使用できますが、Windows NT以降では使用できません)。 delete がtrue(デフォルト)の場合、ファイルは閉じられるとすぐに削除されます。 返されるオブジェクトは常にファイルのようなオブジェクトであり、そのfile属性は基になる真のファイルオブジェクトです。 このファイルのようなオブジェクトは、通常のファイルと同じように、 with ステートメントで使用できます。

バージョン3.8で変更: エラーパラメーターが追加されました。

tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=- 1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

この関数は、ファイルサイズが max_size を超えるまで、またはファイルのfileno()メソッドが呼び出されるまで、データがメモリにスプールされることを除いて、 TemporaryFile()とまったく同じように動作します。この時点で内容がディスクに書き込まれ、 TemporaryFile()と同様に操作が続行されます。

結果のファイルには、rollover()という1つの追加メソッドがあります。これにより、ファイルは、サイズに関係なく、ディスク上のファイルにロールオーバーされます。

返されるオブジェクトは、_file属性が io.BytesIO または io.TextIOWrapper オブジェクトのいずれかであるファイルのようなオブジェクトです(バイナリまたはテキストのどちらであるかによって異なります)。 rollover()が呼び出されたかどうかに応じて、mode が指定されました)またはtrueファイルオブジェクト。 このファイルのようなオブジェクトは、通常のファイルと同じように、 with ステートメントで使用できます。

バージョン3.3で変更: truncateメソッドがsize引数を受け入れるようになりました。

バージョン3.8で変更: エラーパラメーターが追加されました。

tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)

この関数は、 mkdtemp()と同じルールを使用して一時ディレクトリを安全に作成します。 結果のオブジェクトは、コンテキストマネージャーとして使用できます(を参照)。 コンテキストが完了するか、一時ディレクトリオブジェクトが破棄されると、新しく作成された一時ディレクトリとそのすべての内容がファイルシステムから削除されます。

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

cleanup()メソッドを呼び出すことにより、ディレクトリを明示的にクリーンアップできます。

バージョン3.2の新機能。

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

可能な限り最も安全な方法で一時ファイルを作成します。 プラットフォームが os.open()os.O_EXCL フラグを適切に実装していると仮定すると、ファイルの作成に競合状態はありません。 ファイルは、作成するユーザーIDによってのみ読み取りおよび書き込みが可能です。 プラットフォームがパーミッションビットを使用してファイルが実行可能かどうかを示す場合、ファイルは誰も実行可能ではありません。 ファイル記述子は子プロセスに継承されません。

TemporaryFile()とは異なり、 mkstemp()のユーザーは、一時ファイルを使い終わったら削除する責任があります。

サフィックスNoneでない場合、ファイル名はそのサフィックスで終わります。そうでない場合、サフィックスはありません。 mkstemp()は、ファイル名とサフィックスの間にドットを入れません。 必要な場合は、サフィックスの先頭に配置してください。

プレフィックスNoneでない場合、ファイル名はそのプレフィックスで始まります。 それ以外の場合は、デフォルトのプレフィックスが使用されます。 デフォルトは、必要に応じて gettempprefix()または gettempprefixb()の戻り値です。

dirNoneでない場合、ファイルはそのディレクトリに作成されます。 それ以外の場合は、デフォルトのディレクトリが使用されます。 デフォルトのディレクトリはプラットフォームに依存するリストから選択されますが、アプリケーションのユーザーは、 TMPDIRTEMP 、または TMP 環境を設定することでディレクトリの場所を制御できます。変数。 したがって、生成されたファイル名が、os.popen()を介して外部コマンドに渡されるときに引用符を必要としないなど、優れたプロパティを持つという保証はありません。

サフィックスプレフィックス、および dir のいずれかがNoneでない場合は、同じタイプである必要があります。 それらがバイトの場合、返される名前はstrではなくbytesになります。 それ以外の場合はデフォルトの動作でバイトの戻り値を強制する場合は、suffix=bを渡します。

text が指定され、trueの場合、ファイルはテキストモードで開かれます。 それ以外の場合(デフォルト)、ファイルはバイナリモードで開かれます。

mkstemp()は、開いているファイルへのOSレベルのハンドル( os.open()によって返される)とそのファイルの絶対パス名を含むタプルを返します。注文。

バージョン3.5で変更: サフィックスプレフィックス、および dir は、バイトの戻り値を取得するためにバイト単位で指定できるようになりました。 これ以前は、strのみが許可されていました。 サフィックスおよびプレフィックスが受け入れられ、デフォルトでNoneになり、適切なデフォルト値が使用されるようになりました。

バージョン3.6で変更: dir パラメーターは、パスのようなオブジェクトを受け入れるようになりました。

tempfile.mkdtemp(suffix=None, prefix=None, dir=None)

可能な限り最も安全な方法で一時ディレクトリを作成します。 ディレクトリの作成には競合状態はありません。 ディレクトリは、作成するユーザーIDによってのみ読み取り、書き込み、および検索が可能です。

mkdtemp()のユーザーは、一時ディレクトリとその内容を使い終わったら削除する責任があります。

プレフィックスサフィックス、および dir 引数は、 mkstemp()の場合と同じです。

mkdtemp()は、新しいディレクトリの絶対パス名を返します。

バージョン3.5で変更: サフィックスプレフィックス、および dir は、バイトの戻り値を取得するためにバイト単位で指定できるようになりました。 これ以前は、strのみが許可されていました。 サフィックスおよびプレフィックスが受け入れられ、デフォルトでNoneになり、適切なデフォルト値が使用されるようになりました。

バージョン3.6で変更: dir パラメーターは、パスのようなオブジェクトを受け入れるようになりました。

tempfile.gettempdir()

一時ファイルに使用されるディレクトリの名前を返します。 これは、このモジュールのすべての関数に対する dir 引数のデフォルト値を定義します。

Pythonは、ディレクトリの標準リストを検索して、呼び出し元のユーザーがファイルを作成できるディレクトリを見つけます。 リストは次のとおりです。

  1. TMPDIR環境変数によって指定されたディレクトリ。

  2. TEMP環境変数によって指定されたディレクトリ。

  3. TMP環境変数によって指定されたディレクトリ。

  4. プラットフォーム固有の場所:

    • Windowsでは、ディレクトリC:\TEMPC:\TMP\TEMP\TMPの順になります。

    • 他のすべてのプラットフォームでは、ディレクトリ/tmp/var/tmp/usr/tmpの順になります。

  5. 最後の手段として、現在の作業ディレクトリ。

この検索の結果はキャッシュされます。以下の tempdir の説明を参照してください。

tempfile.gettempdirb()

gettempdir()と同じですが、戻り値はバイト単位です。

バージョン3.5の新機能。

tempfile.gettempprefix()
一時ファイルの作成に使用されるファイル名プレフィックスを返します。 これには、ディレクトリコンポーネントは含まれていません。
tempfile.gettempprefixb()

gettempprefix()と同じですが、戻り値はバイト単位です。

バージョン3.5の新機能。

モジュールはグローバル変数を使用して、 gettempdir()によって返される一時ファイルに使用されるディレクトリの名前を格納します。 選択プロセスをオーバーライドするように直接設定できますが、これはお勧めしません。 このモジュールのすべての関数は、ディレクトリを指定するために使用できる dir 引数を取ります。これは、推奨されるアプローチです。

tempfile.tempdir

None以外の値に設定すると、この変数は、このモジュールで定義されている関数の dir 引数のデフォルト値を定義します。

gettempprefix()を除く上記の関数のいずれかの呼び出しで、tempdirNone(デフォルト)の場合、 gettempdir( )

tempfile モジュールの一般的な使用例を次に示します。

>>> import tempfile

# create a temporary file and write some data to it
>>> fp = tempfile.TemporaryFile()
>>> fp.write(b'Hello world!')
# read data from file
>>> fp.seek(0)
>>> fp.read()
b'Hello world!'
# close the file, it will be removed
>>> fp.close()

# create a temporary file using a context manager
>>> with tempfile.TemporaryFile() as fp:
...     fp.write(b'Hello world!')
...     fp.seek(0)
...     fp.read()
b'Hello world!'
>>>
# file is now closed and removed

# create a temporary directory using the context manager
>>> with tempfile.TemporaryDirectory() as tmpdirname:
...     print('created temporary directory', tmpdirname)
>>>
# directory and contents have been removed

非推奨の関数と変数

一時ファイルを作成する歴史的な方法は、最初に mktemp()関数を使用してファイル名を生成し、次にこの名前を使用してファイルを作成することでした。 残念ながら、これは安全ではありません。 mktemp()が呼び出されてから、最初のプロセスでファイルを作成しようとするまでの間に、別のプロセスがこの名前のファイルを作成する可能性があるためです。 解決策は、2つのステップを組み合わせて、すぐにファイルを作成することです。 このアプローチは、 mkstemp()および上記の他の関数によって使用されます。

tempfile.mktemp(suffix=, prefix='tmp', dir=None)

バージョン2.3以降非推奨:代わりに mkstemp()を使用してください。

呼び出し時に存在しなかったファイルの絶対パス名を返します。 プレフィックスサフィックス、および dir 引数は、バイトファイル名suffix=Noneおよびprefix=Noneはサポートされていません。

警告

この機能を使用すると、プログラムにセキュリティホールが発生する可能性があります。 あなたがそれが返すファイル名で何かをすることに取り掛かる時までに、他の誰かがあなたを殴打したかもしれません。 mktemp()の使用法は、 NamedTemporaryFile()に簡単に置き換えることができ、delete=Falseパラメーターを渡します。

>>> f = NamedTemporaryFile(delete=False)
>>> f.name
'/tmp/tmptjujjt'
>>> f.write(b"Hello World!\n")
13
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False