# 22 `tempfile` -- 一時的なファイルやディレクトリの生成

このモジュールを使うと、一時的なファイルやディレクトリを生成できます。 このモジュールはサポートされている全てのプラットフォームで利用可能 です。

バージョン 2.3 の Python では、このモジュールに対してセキュリティを 高める為の見直しが行われました。現在では新たに 3 つの関数、 `NamedTemporaryFile()`、 `mkstemp()`、および `mkdtemp()` が提供されており、安全でない `mktemp` を使いつづける必要をなくしました。 このモジュールで生成される一時ファイルはもはやプロセス番号を 含みません; その代わり、6 桁のランダムな文字からなる文字列が 使われます。

また、ユーザから呼び出し可能な関数は全て、一時ファイルの場所や 名前を直接操作できるようにするための追加の引数をとるように なりました。もはや変数 tempdir および template を 使う必要はありません。以前のバージョンとの互換性を維持するために、 引数の順番は多少変です; 明確さのためにキーワード引数を使うことを お勧めします。

このモジュールではユーザから呼び出し可能な以下の関数を定義しています:

`TemporaryFile`( | [mode=`'w+b'`[, bufsize=`-1`[, suffix[, prefix[, dir]]]]])

  一時的な記憶領域として使うことができるファイル (またはファイル類似の) オブジェクトを返します。ファイルは `mkstemp` を使って 生成されます。このファイルは閉じられると (オブジェクトが ガーベジコレクションされた際に、暗黙のうちに閉じられる場合を含みます) すぐに消去されます。Unix環境では、ファイルが生成されるとすぐに そのファイルのディレクトリエントリは除去されてしまいます。一方、他の プラットフォームではこの機能はサポートされていません; 従って、 コードを書くときには、この関数で作成した一時ファイルをファイルシステム上で見る ことができる、あるいはできないということをあてにすべきではありません。

  生成されたファイルを一旦閉じなくてもファイルを読み書きできるように するために、mode パラメタは標準で `'w+b'` に設定されています。 ファイルに記録するデータが何であるかに関わらず全てのプラットフォームで 一貫性のある動作をさせるために、バイナリモードが使われています。 bufsize の値は標準で `-1` で、これはオペレーティングシステム における標準の値を使うことを意味しています。

  dir、prefix および suffix パラメタは `mkstemp()` に渡されます。

`NamedTemporaryFile`( | [mode=`'w+b'`[, bufsize=`-1`[, suffix[, prefix[, dir]]]]])

  この関数はファイルがファイルシステム上で見ることができるよう保証 されている点を除き、`TemporaryFile()` と全く同じに働きます。 (Unixでは、ディレクトリ エントリはunlinkされません) ファイル名はファイルオブジェクトの `name` メンバから 取得することができます。このファイル名を使って一時ファイルをもう一度 開くとことができるかどうかは、プラットフォームによって異なります。 (Unixでは可能でしたが、Windows NT以降では開く事ができません。)

  バージョン 2.3 で 新たに追加 された仕様です。

`mkstemp`( | [suffix[, prefix[, dir[, text]]]])

  可能な限り最も安全な手段で一時ファイルを生成します。 使用するプラットフォームで`os.open()` の `O_EXCL` フラグが正しく実装されている限り、ファイルの生成で競合条件が起こる ことはありません。このファイルは、ファイルを生成したユーザのユーザ ID からのみ読み書き可能です。使用するプラットフォームにおいて、 ファイルを実行可能かどうかを示す許可ビットが使われている場合、 ファイルは誰からも実行不可なように設定されます。 このファイルのファイル記述子は子プロセスに継承されません。

  `TemporaryFile()` と違って、`mkstemp()` で生成された ファイルが用済みになったときにファイルを消去するのはユーザの責任です。

  suffix が指定された場合、ファイル名は指定された 拡張子で終わります。そうでない場合には拡張子は付けられません。 `mkstemp()` はファイル名と拡張子の間にドットを追加 しません; 必要なら、suffix の先頭につけてください。

  prefix が指定された場合、ファイル名は指定された プレフィクス(接頭文字列) で始まります; そうでない場合、標準の プレフィクスが使われます。

  dir が指定された場合、一時ファイルは指定されたディレクトリ 下に作成されます; そうでない場合、標準のディレクトリが使われます。

  text が指定された場合、ファイルをバイナリモード (標準の設定) かテキストモードで開くかを示します。使用するプラットフォームによっては この値を設定しても変化はありません。

  `mkstemp()` は開かれたファイルを扱うための OS レベルの値 とファイルの絶対パス名が順番に並んだタプルを返します。 バージョン 2.3 で 新たに追加 された仕様です。

`mkdtemp`( | [suffix[, prefix[, dir]]])

  可能な限り安全な方法で一時ディレクトリを作成します。 ディレクトリの生成で競合条件は発生しません。 ディレクトリを作成したユーザ ID だけが、このディレクトリ に対して内容を読み出したり、書き込んだり、検索したりすることが できます。

  `mkdtemp()` によって作られたディレクトリとその内容が用済みに なった時、にそれを消去するのはユーザの責任です。

  prefix、suffix、および dir 引数は `mkstemp()` のものと同じです。

  `mkdtemp()` は新たに生成されたディレクトリの絶対パス名を 返します。 バージョン 2.3 で 新たに追加 された仕様です。

`mkdtemp`( | [suffix[, prefix[, dir]]])

  リリース 2.3 で撤廃されました。 Use `mkstemp()` instead.

  一時ファイルの絶対パス名を返します。このパス名は少なくともこの関数が 呼び出された時点ではファイルシステム中に存在しなかったパス名です。 prefix、prefix、 suffix、および dir 引数は `mkstemp()` のものと同じです。

  警告: この関数を使うとプログラムのセキュリティホールになる可能性 があります。この関数が返したファイル名を返した後、あなたがそのファイル名 を使って次に何かをしようとする段階に至る前に、誰か他の人間が あなたにパンチをくらわせてしまうかもしれません。

このモジュールでは、一時的なファイル名の作成方法を指定する 2 つの グローバル変数を使います。これらの変数は上記のいずれかの関数を最初 に呼び出した際に初期化されます。関数呼び出しをおこなうユーザは これらの値を変更することができますが、これはお勧めできません; その代わりに関数に適切な引数を指定してください。

`tempdir`
  この値が `None` 以外に設定された場合、このモジュールで定義されて いる関数全てのdir 引数に対する標準の設定値となります。

  tempdir が設定されていないか `None` の場合、上記のいずれかの 関数を呼び出した際は常に、Python は標準的なディレクトリ候補のリスト を検索し、関数を呼び出しているユーザの権限でファイルを作成できる 最初のディレクトリ候補を tempdir に設定します。リストは以下の ようになっています:

  1. 環境変数 TMPDIR で与えられているディレクトリ名。
  2. 環境変数 TEMP で与えられているディレクトリ名。
  3. 環境変数 TMP で与えられているディレクトリ名。
  4. プラットフォーム依存の場所:
     - Macintosh では Temporary Items フォルダ。
     - RiscOS では環境変数 Wimp$ScrapDir で与えられて いるディレクトリ名。
     - Windows ではディレクトリ C:\TEMP、 C:\TMP、 \TEMP、および \TMP の順。
     - その他の全てのプラットフォームでは、/tmp、 /var/tmp、および /usr/tmp の順。
  5. 最後の手段として、現在の作業ディレクトリ。

`gettempdir`( | )

  現在選択されている、テンポラリファイルを作成するためのディレクトリ を返します。tempdir が `None` でない場合、単にその内容 を返します; そうでない場合には上で記述されている検索が実行され、 その結果が返されます。

`template`
  リリース 2.0 で撤廃されました。 代わりに `gettempprefix()` を使ってください。

  この値に `None` 以外の値を設定した場合、`mktemp()` が返すファイル名のディレクトリ部を含まない先頭部分 (プレフィクス) を 定義します。ファイル名を一意にするために、 6 つのランダムな文字および 数字がこのプレフィクスの後に追加されます。Windows では、標準の プレフィクスは~T です; 他のシステムでは tmp です。

  このモジュールの古いバージョンでは、`os.fork()` を呼び出した 後に `template` を `None` に設定することが必要でした; この仕様はバージョン 1.5.2 からは必要なくなりました。

`gettempprefix`( | )

  一時ファイルを生成する際に使われるファイル名の先頭部分を返します。 この先頭部分にはディレクトリ部は含まれません。変数 template を直接読み出すよりもこの関数を使うことを勧めます。 バージョン 1.5.2 で 新たに追加 された仕様です。