# 11.6. `tempfile` - 生成临时文件和目录

源代码： Lib / tempfile.py

此模块被用于创建临时文件和目录。它可以运行在所有python支持的操作系统上。`TemporaryFile`, `NamedTemporaryFile`, `TemporaryDirectory`, 和 `SpooledTemporaryFile` 是高级函数，提供自动清理和内容管理功能。`mkstemp()` 和 `mkdtemp()` 是底层函数，需要手动清理。

所有用户可调用的函数和构造函数接受附加的参数，这些参数允许直接控制临时文件和目录的位置和名称。此模块使用的文件名包括一个随机字符串，允许这些文件在共享临时目录中安全地创建。为了保持向后兼容性，参数顺序有点奇怪；为了清楚起见，建议使用关键字参数。

Tempfile模块定义了以下函数︰

`tempfile.``TemporaryFile`(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)

  返回一个类文件对象以提供临时的数据存储空间。使用与`mkstemp()`相同的规则安全地创建文件。它将被关闭时立即被销毁（包括当对象被垃圾收集时的隐式关闭）。在Unix下，文件的目录条目根本不创建，或在文件创建后立即删除。其他平台不支持；您的代码不应该依赖于使用此函数创建的临时文件在文件系统中是否具有可见名称。

  生成的对象可以用作上下文管理器（参见Examples）。在完成上下文或销毁文件对象时，临时文件将从文件系统中删除。

  模式参数默认为`'w+b'`，以便创建的文件可以在不关闭的情况下读写。使用二进制模式，以便它在所有平台上一致地运行，而不考虑存储的数据。缓冲，编码和换行被解释为`open()`。

  dir，前缀和后缀参数的含义和默认值与`mkstemp()`相同。

  返回的对象是POSIX平台上的一个真正的文件对象。在其他平台上，它是一个类文件对象，其`file`属性是基础的真实文件对象。

  如果可用且可行，则使用`os.O_TMPFILE`标志（特定于Linux，需要Linux内核3.11或更高版本）。

  在3.5版本中已更改：现在使用`os.O_TMPFILE`标志（如果可用）。

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

  此函数与`TemporaryFile()`完全一样，除了文件保证在文件系统中有一个可见的名称（在Unix上，目录项没有取消链接）。该名称可以从返回的类文件对象的`name`属性中检索。该名称是否可用于第二次打开该文件，而命名的临时文件仍然是打开的，在不同的平台（它可以这样在Unix上使用；它不能在Windows NT或更高版本）。如果delete为true（默认值），则文件一被关闭即被删除。返回的对象始终是类文件对象，其`file`属性是基础的真实文件对象。这个类文件对象可以在`with`语句中使用，就像普通文件一样。

`tempfile.``SpooledTemporaryFile`(max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, 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()`.

  生成的文件还有一个附加方法，`rollover()`，这将导致文件滚动到磁盘文件，而不管其大小。

  返回的对象是类文件对象，其`_file`属性是`io.BytesIO`或`io.StringIO`对象文本模式）或真正的文件对象，具体取决于是否已调用`rollover()`。这个类文件对象可以在`with`语句中使用，就像普通文件一样。

  在版本3.3中更改： truncate方法现在接受`size`参数。

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

  此函数使用与`mkdtemp()`相同的规则安全地创建临时目录。生成的对象可以用作上下文管理器（参见Examples）。在完成上下文或销毁临时目录对象后，新创建的临时目录及其所有内容将从文件系统中删除。

  可以从返回的对象的`name`属性检索目录名称。当返回的对象用作上下文管理器时，`name`将分配给`with`语句中`as`子句的目标，if有一个。

  可以通过调用`cleanup()`方法显式清除目录。

  版本3.2中的新功能。

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

  以最安全的方式创建临时文件。假设平台正确地实现了`os.open()`的`os.O_EXCL`标志，则文件创建中没有竞争条件。该文件只能由创建用户标识读写。如果平台使用权限位来指示文件是否可执行，则该文件不可由任何人执行。文件描述器不会被子进程继承。

  与`TemporaryFile()`不同，`mkstemp()`的用户负责在完成后删除临时文件。

  如果后缀不是`None`，则文件名将以该后缀结尾，否则将没有后缀。`mkstemp()`不会在文件名和后缀之间加一个点；如果需要，将其放在后缀的开头。

  如果前缀不是`None`，文件名将以该前缀开头；否则，使用默认前缀。默认值为`gettempprefix()`或`gettempprefixb()`的返回值。

  如果dir不是`None`，则将在该目录中创建文件；否则，将使用默认目录。默认目录从平台相关列表中选择，但应用程序的用户可以通过设置TMPDIR，TEMP或TMP t> t2>环境变量。因此，不能保证生成的文件名将具有任何不错的属性，例如当通过`os.popen()`传递到外部命令时不需要引用。

  如果后缀，前缀和dir中的任何一个不是`None`，则它们必须是相同类型。如果它们是字节，返回的名称将是字节而不是str。如果要强制字节返回值，否则默认行为，传递`suffix=b''`。

  如果指定文本，则指示是以二进制模式（默认）还是文本模式打开文件。在某些平台上，这没有什么区别。

  `mkstemp()`返回一个包含打开文件的操作系统级句柄的元组（由`os.open()`返回）和该文件的绝对路径名， 。

  Changed in version 3.5: suffix, prefix, and dir may now be supplied in bytes in order to obtain a bytes return value. 在此之前，只允许str。后缀和前缀现在接受并默认为`None`，以使用适当的默认值。

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

  以最安全的方式创建临时目录。目录的创建没有竞争条件。该目录只有创建用户ID才可读，可写和可搜索。

  `mkdtemp()`的用户负责在完成操作后删除临时目录及其内容。

  前缀，后缀和dir参数与`mkstemp()`相同。

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

  Changed in version 3.5: suffix, prefix, and dir may now be supplied in bytes in order to obtain a bytes return value. 在此之前，只允许str。后缀和前缀现在接受并默认为`None`，以使用适当的默认值。

`tempfile.``gettempdir`()

  返回用于临时文件的目录的名称。这定义了此模块中所有函数的dir参数的默认值。

  Python搜索标准目录列表以找到调用用户可以在其中创建文件的目录。列表是：

  1. 由 `TMPDIR`
  2. 由 `TEMP`
  3. 由 `TMP`
  4. 平台特定位置：
     - 在Windows上，目录`C:\TEMP`，`C:\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()`之外的任何函数的任何调用上，`tempdir`未设置或`None`，则按照`gettempdir()`。

## 11.6.1.示例

以下是`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

## 11.6.2.已弃用的函数和变量

创建临时文件的历史方法是首先使用`mktemp()`函数生成文件名，然后使用此名称创建文件。不幸的是，这不安全，因为不同的进程可能会在调用`mktemp()`和随后尝试通过第一个进程创建文件之间的时间创建一个具有此名称的文件。解决方案是结合这两个步骤并立即创建文件。此方法由`mkstemp()`和上述其他函数使用。

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

  从版本2.3开始弃用：改为使用`mkstemp()`。

  返回在调用时不存在的文件的绝对路径名。The prefix, suffix, and dir arguments are similar to those of `mkstemp()`, except that bytes file names, `suffix=None` and `prefix=None` are not supported.

  警告

  使用此功能可能会在程序中引入安全漏洞。当你回来做任何事情与文件名，它返回，其他人可能会打败你打。`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