# 10.6. `tempfile` — 生成临时文件和目录

源代码： Lib/tempfile.py

This module generates temporary files and directories. It works on all supported platforms.

In version 2.3 of Python, this module was overhauled for enhanced security. It now provides three new functions, `NamedTemporaryFile()`, `mkstemp()`, and `mkdtemp()`, which should eliminate all remaining need to use the insecure `mktemp()` function. Temporary file names created by this module no longer contain the process ID; instead a string of six random characters is used.

Also, all the user-callable functions now take additional arguments which allow direct control over the location and name of temporary files. It is no longer necessary to use the global tempdir and template variables. To maintain backward compatibility, the argument order is somewhat odd; it is recommended to use keyword arguments for clarity.

The module defines the following user-callable functions:

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

  Return a file-like object that can be used as a temporary storage area. The file is created using `mkstemp()`. It will be destroyed as soon as it is closed (including an implicit close when the object is garbage collected). Under Unix, the directory entry for the file is removed immediately after the file is created. Other platforms do not support this; your code should not rely on a temporary file created using this function having or not having a visible name in the file system.

  The mode parameter defaults to `'w+b'` so that the file created can be read and written without being closed. Binary mode is used so that it behaves consistently on all platforms without regard for the data that is stored. bufsize defaults to `-1`, meaning that the operating system default is used.

  The dir, prefix and suffix parameters are passed to `mkstemp()`.

  The returned object is a true file object on POSIX platforms. On other platforms, it is a file-like object whose `file` attribute is the underlying true file object. This file-like object can be used in a `with` statement, just like a normal file.

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

  This function operates exactly as `TemporaryFile()` does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry is not unlinked). That name can be retrieved from the `name` attribute of the returned file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later). If delete is true (the default), the file is deleted as soon as it is closed.

  The returned object is always a file-like object whose `file` attribute is the underlying true file object. This file-like object can be used in a `with` statement, just like a normal file.

  2.3 新版功能.

  2.6 新版功能: The delete parameter.

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

  This function operates exactly as `TemporaryFile()` does, except that data is spooled in memory until the file size exceeds max_size, or until the file’s `fileno()` method is called, at which point the contents are written to disk and operation proceeds as with `TemporaryFile()`. Also, it’s `truncate` method does not accept a `size` argument.

  此函数生成的文件对象有一个额外的方法——`rollover()`，可以忽略文件大小，让文件立即写入磁盘。

  The returned object is a file-like object whose `_file` attribute is either a `StringIO` object or a true file object, depending on whether `rollover()` has been called. This file-like object can be used in a `with` statement, just like a normal file.

  2.6 新版功能.

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

  以最安全的方式创建一个临时文件。假设所在平台正确实现了 `os.open()` 的 `os.O_EXCL` 标志，则创建文件时不会有竞争的情况。该文件只能由创建者读写，如果所在平台用权限位来标记文件是否可执行，那么没有人有执行权。文件描述符不会过继给子进程。

  与 `TemporaryFile()` 不同，`mkstemp()` 用户用完临时文件后需要自行将其删除。

  If suffix is specified, the file name will end with that suffix, otherwise there will be no suffix. `mkstemp()` does not put a dot between the file name and the suffix; if you need one, put it at the beginning of suffix.

  If prefix is specified, the file name will begin with that prefix; otherwise, a default prefix is used.

  If dir is specified, the file will be created in that directory; otherwise, a default directory is used. The default directory is chosen from a platform-dependent list, but the user of the application can control the directory location by setting the TMPDIR, TEMP or TMP environment variables. There is thus no guarantee that the generated filename will have any nice properties, such as not requiring quoting when passed to external commands via `os.popen()`.

  如果指定了 text 参数，它表示的是以二进制模式（默认）还是文本模式打开文件。在某些平台上，两种模式没有区别。

  `mkstemp()` 返回一个元组，元组中第一个元素是句柄，它是一个系统级句柄，指向一个打开的文件（等同于 `os.open()` 的返回值），第二元素是该文件的绝对路径。

  2.3 新版功能.

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

  以最安全的方式创建一个临时目录，创建该目录时不会有竞争的情况。该目录只能由创建者读取、写入和搜索。

  `mkdtemp()` 用户用完临时目录后需要自行将其删除。

  prefix、suffix 和 dir 的含义与它们在 `mkstemp()` 中的相同。

  `mkdtemp()` 返回新目录的绝对路径名。

  2.3 新版功能.

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

  2.3 版后已移除: 使用 `mkstemp()` 来代替。

  Return an absolute pathname of a file that did not exist at the time the call is made. The prefix, suffix, and dir arguments are the same as for `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

The module uses a global variable that tell it how to construct a temporary name. They are initialized at the first call to any of the functions above. The caller may change them, but this is discouraged; use the appropriate function arguments, instead.

`tempfile.``tempdir`

  When set to a value other than `None`, this variable defines the default value for the dir argument to all the functions defined in this module.

  If `tempdir` is unset or `None` at any call to any of the above functions, Python searches a standard list of directories and sets tempdir to the first one which the calling user can create files in. The list is:

  1. `TMPDIR` 环境变量指向的目录。

  2. `TEMP` 环境变量指向的目录。

  3. `TMP` 环境变量指向的目录。

  4. 与平台相关的位置：

     - On RiscOS, the directory named by the `Wimp$ScrapDir` environment variable.

     - 在 Windows 上，依次为 `C:\TEMP`、`C:\TMP`、`\TEMP` 和 `\TMP`。

     - 在所有其他平台上，依次为 `/tmp`、`/var/tmp` 和 `/usr/tmp`。

  5. 不得已时，使用当前工作目录。

`tempfile.``gettempdir`()

  Return the directory currently selected to create temporary files in. If `tempdir` is not `None`, this simply returns its contents; otherwise, the search described above is performed, and the result returned.

  2.3 新版功能.

`tempfile.``template`

  2.0 版后已移除: Use `gettempprefix()` instead.

  When set to a value other than `None`, this variable defines the prefix of the final component of the filenames returned by `mktemp()`. A string of six random letters and digits is appended to the prefix to make the filename unique. The default prefix is `tmp`.

  Older versions of this module used to require that `template` be set to `None` after a call to `os.fork()`; this has not been necessary since version 1.5.2.

`tempfile.``gettempprefix`()

  Return the filename prefix used to create temporary files. This does not contain the directory component. Using this function is preferred over reading the template variable directly.

  1.5.2 新版功能.