Skip to main content

11.6. tempfile —生成临时文件和目录

源代码: Lib/tempfile.py


此模块创建临时文件和目录。它适用于所有支持的平台。 TemporaryFileNamedTemporaryFileTemporaryDirectorySpooledTemporaryFile 是提供自动清理并且可以用作上下文管理器的高级接口。 mkstemp()mkdtemp() 是需要手动清除的低级功能。

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

模块定义以下用户可调用的项目:

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

返回可用作临时存储区域的 file-like object。使用与 mkstemp() 相同的规则安全地创建文件。它将被关闭时立即被销毁(包括在对象被垃圾收集时的隐式关闭)。在Unix下,文件的目录条目根本不创建,或在文件创建后立即删除。其他平台不支持;您的代码不应该依赖于使用此函数创建的临时文件在文件系统中是否具有可见名称。

生成的对象可以用作上下文管理器(请参阅 例子)。在完成上下文或销毁文件对象时,临时文件将从文件系统中删除。

mode 参数默认为 'w+b',以便可以读取和写入创建的文件而不关闭。使用二进制模式,以便它在所有平台上一致地运行,而不考虑存储的数据。 bufferingencodingnewline 解释为 open()

dirprefixsuffix 参数具有与 mkstemp() 相同的含义和默认值。

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

如果 os.O_TMPFILE 标志可用且可用(特定于Linux,需要Linux内核3.11或更高版本),则使用 os.O_TMPFILE 标志。

在 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)

此函数与 TemporaryFile() 完全一样,除了数据在内存中假脱机,直到文件大小超过 max_size,或直到调用文件的 fileno() 方法,此时内容被写入磁盘,操作就像 TemporaryFile() 一样进行。

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

返回的对象是类文件对象,其 _file 属性是 io.BytesIOio.StringIO 对象(取决于是否指定了二进制或文本 mode)或真正的文件对象,具体取决于是否已调用 rollover()。这个类文件对象可以在 with 语句中使用,就像普通文件一样。

在 3.3 版更改: truncate方法现在接受 size 参数。

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 标志。该文件只能由创建用户标识读写。如果平台使用权限位来指示文件是否可执行,则该文件不可由任何人执行。子进程不继承文件描述符。

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

如果 suffix 不是 None,文件名将以该后缀结尾,否则将没有后缀。 mkstemp() 不会在文件名和后缀之间放置一个点;如果你需要一个,把它放在 suffix 的开头。

如果 prefix 不是 None,文件名将以该前缀开头;否则,使用默认前缀。缺省值为 gettempprefix()gettempprefixb() 的返回值(如适用)。

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

如果 suffixprefixdir 中的任何一个不是 None,它们必须是相同类型。如果它们是字节,返回的名称将是字节而不是str。如果你想强制一个字节返回值否则默认行为,传递 suffix=b''

如果指定了 text,它指示是以二进制模式(默认)还是文本模式打开文件。在一些平台上,这没有什么区别。

mkstemp() 返回一个包含操作系统级别句柄的元组到打开的文件(由 os.open() 返回)以及该文件的绝对路径名。

在 3.5 版更改: 现在可以以字节提供 suffixprefixdir,以便获得字节返回值。在此之前,只允许str。 suffixprefix 现在接受并默认为 None,以使用适当的默认值。

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

以最安全的方式创建临时目录。目录的创建没有竞争条件。该目录是可读,可写的,并且只能由创建用户ID搜索。

mkdtemp() 的用户负责在删除临时目录及其内容时使用它。

prefixsuffixdir 参数与 mkstemp() 相同。

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

在 3.5 版更改: 现在可以以字节提供 suffixprefixdir,以便获得字节返回值。在此之前,只允许str。 suffixprefix 现在接受并默认为 None,以使用适当的默认值。

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() 之外的任何上述函数时 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()

返回在调用时不存在的文件的绝对路径名。除了不支持字节文件名,suffix=Noneprefix=Noneprefixsuffixdir 参数与 mkstemp() 类似。

警告

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