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

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

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

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



このモジュールは、一時ファイルとディレクトリを生成します。 サポートされているすべてのプラットフォームで動作します。

Pythonのバージョン2.3では、セキュリティを強化するためにこのモジュールがオーバーホールされました。 NamedTemporaryFile()mkstemp()mkdtemp()の3つの新しい関数が提供されるようになりました。これにより、安全でないを使用する必要がなくなります。 ] mktemp()関数。 このモジュールによって作成された一時ファイル名には、プロセスIDが含まれなくなりました。 代わりに、6つのランダムな文字の文字列が使用されます。

また、すべてのユーザー呼び出し可能な関数は、一時ファイルの場所と名前を直接制御できるようにする追加の引数を取るようになりました。 グローバル tempdir および template 変数を使用する必要がなくなりました。 下位互換性を維持するために、引数の順序はやや奇妙です。 わかりやすくするために、キーワード引数を使用することをお勧めします。

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

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=[, prefix='tmp'[, dir=None]]]]])

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

mode パラメーターのデフォルトは'w+b'であるため、作成されたファイルは閉じずに読み書きできます。 バイナリモードは、保存されているデータに関係なく、すべてのプラットフォームで一貫して動作するように使用されます。 bufsize のデフォルトは-1です。これは、オペレーティングシステムのデフォルトが使用されることを意味します。

dirプレフィックス、およびサフィックスパラメーターが mkstemp()に渡されます。

返されるオブジェクトは、POSIXプラットフォーム上の真のファイルオブジェクトです。 他のプラットフォームでは、file属性が基になる真のファイルオブジェクトであるファイルのようなオブジェクトです。 このファイルのようなオブジェクトは、通常のファイルと同じように、 with ステートメントで使用できます。

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=[, prefix='tmp'[, dir=None[, delete=True]]]]]])

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

返されるオブジェクトは常にファイルのようなオブジェクトであり、そのfile属性は基になる真のファイルオブジェクトです。 このファイルのようなオブジェクトは、通常のファイルと同じように、 with ステートメントで使用できます。

バージョン2.3の新機能。

バージョン2.6の新機能: delete パラメーター。

tempfile.SpooledTemporaryFile([max_size=0[, mode='w+b'[, bufsize=-1[, suffix=[, prefix='tmp'[, dir=None]]]]]])

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

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

返されるオブジェクトは、_file属性が、rollover()が呼び出されたかどうかに応じて、 StringIO オブジェクトまたは実際のファイルオブジェクトのいずれかであるファイルのようなオブジェクトです。 このファイルのようなオブジェクトは、通常のファイルと同じように、 with ステートメントで使用できます。

バージョン2.6の新機能。

tempfile.mkstemp([suffix=[, prefix='tmp'[, dir=None[, text=False]]]])

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

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

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

prefix が指定されている場合、ファイル名はそのプレフィックスで始まります。 それ以外の場合は、デフォルトのプレフィックスが使用されます。

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

text が指定されている場合は、ファイルをバイナリモード(デフォルト)で開くか、テキストモードで開くかを示します。 一部のプラットフォームでは、これによって違いはありません。

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

バージョン2.3の新機能。

tempfile.mkdtemp([suffix=[, prefix='tmp'[, dir=None]]])

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

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

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

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

バージョン2.3の新機能。

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

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

呼び出し時に存在しなかったファイルの絶対パス名を返します。 プレフィックスサフィックス、および dir 引数は、 mkstemp()の場合と同じです。

警告

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

>>> f = NamedTemporaryFile(delete=False)
>>> f
<open file '<fdopen>', mode 'w+b' at 0x384698>
>>> f.name
'/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0'
>>> f.write("Hello World!\n")
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False

モジュールは、一時的な名前の作成方法を指示するグローバル変数を使用します。 これらは、上記の関数のいずれかを最初に呼び出したときに初期化されます。 発信者はそれらを変更できますが、これはお勧めできません。 代わりに、適切な関数の引数を使用してください。

tempfile.tempdir

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

上記の関数のいずれかを呼び出したときにtempdirが設定されていないか、Noneの場合、Pythonはディレクトリの標準リストを検索し、 tempdir を呼び出し元のユーザーが最初に設定したものに設定します。でファイルを作成できます。 リストは次のとおりです。

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

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

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

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

    • RiscOSで、 Wimp$ScrapDir環境変数によって指定されたディレクトリ。

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

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

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

tempfile.gettempdir()

で一時ファイルを作成するために現在選択されているディレクトリを返します。 tempdirNoneでない場合、これは単にその内容を返します。 それ以外の場合は、上記の検索が実行され、結果が返されます。

バージョン2.3の新機能。

tempfile.template

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

None以外の値に設定すると、この変数は mktemp()によって返されるファイル名の最後のコンポーネントのプレフィックスを定義します。 ファイル名を一意にするために、6つのランダムな文字と数字の文字列がプレフィックスに追加されます。 デフォルトのプレフィックスはtmpです。

このモジュールの古いバージョンでは、 os.fork()を呼び出した後、templateNoneに設定する必要がありました。 これはバージョン1.5.2以降必要ありません。

tempfile.gettempprefix()

一時ファイルの作成に使用されるファイル名プレフィックスを返します。 これには、ディレクトリコンポーネントは含まれていません。 template 変数を直接読み取るよりも、この関数を使用することをお勧めします。

バージョン1.5.2の新機能。