tempfile ---生成临时文件和目录

源代码: Lib/tempfile.py


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

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

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

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

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

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

这个 mode 参数默认为 'w+b' 这样就可以在不关闭的情况下读取和写入创建的文件。使用二进制模式是为了使它在所有平台上的行为一致,而不考虑存储的数据。 缓冲encodingerrorsnewline 被解释为 open() .

这个 dir前缀后缀 参数的含义和默认值与 mkstemp() .

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

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

提出一个 auditing event tempfile.mkstemp 带着论证 fullpath .

在 3.5 版更改: 这个 os.O_TMPFILE 如果可用,现在将使用标志。

在 3.8 版更改: 补充 errors 参数。

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

此函数的操作方式与 TemporaryFile() 除了保证文件在文件系统中有一个可见的名称(在Unix上,目录项没有取消链接)外,没有。该名称可以从 name 返回的类似文件的对象的属性。当命名的临时文件仍处于打开状态时,是否可以再次使用该名称来打开该文件,这在不同的平台上有所不同(它可以在Unix上使用,不能在Windows NT或更高版本上使用)。如果 删除 为真(默认值),文件一关闭就会被删除。返回的对象始终是一个类似文件的对象,其 file 属性是基础的true文件对象。此类似文件的对象可用于 with 语句,就像普通文件一样。

提出一个 auditing event tempfile.mkstemp 带着论证 fullpath .

在 3.8 版更改: 补充 errors 参数。

tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=- 1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

此函数的操作方式与 TemporaryFile() 是的,除非数据在内存中假脱机,直到文件大小超过 max_size 或者直到文件 fileno() 方法,此时内容将写入磁盘,操作将继续进行 TemporaryFile() .

结果文件有一个附加方法, rollover() ,这将导致文件回滚到磁盘上的文件,而不考虑其大小。

返回的对象是一个类似文件的对象,其 _file 属性是 io.BytesIOio.TextIOWrapper 对象(取决于二进制还是文本 mode 或一个真正的文件对象,取决于 rollover() 已被调用。此类似文件的对象可用于 with 语句,就像普通文件一样。

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

在 3.8 版更改: 补充 errors 参数。

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

此函数使用与 mkdtemp() . 结果对象可以用作上下文管理器(请参见 实例 )完成上下文或销毁临时目录对象后,新创建的临时目录及其所有内容将从文件系统中删除。

目录名可以从 name 返回对象的属性。当返回的对象用作上下文管理器时, name 将分配给 as 中的子句 with 声明,如果有。

可以通过调用 cleanup() 方法。

提出一个 auditing event tempfile.mkdtemp 带着论证 fullpath .

3.2 新版功能.

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

以最安全的方式创建临时文件。在文件的创建过程中没有竞争条件,假定平台正确地实现了 os.O_EXCLos.open() . 只有创建用户ID才能读取和写入该文件。如果平台使用权限位指示文件是否可执行,则任何人都无法执行该文件。子进程不继承文件描述符。

不像 TemporaryFile() ,的用户 mkstemp() 负责删除临时文件。

如果 后缀 不是 None ,文件名将以该后缀结尾,否则将没有后缀。 mkstemp() 不在文件名和后缀之间加一个点;如果需要,请将其放在 后缀 .

如果 前缀 不是 None 文件名将以该前缀开头;否则,将使用默认前缀。默认值是 gettempprefix()gettempprefixb() ,视情况而定。

如果 dir 不是 None ,文件将在该目录中创建;否则,将使用默认目录。默认目录是从依赖平台的列表中选择的,但是应用程序的用户可以通过设置 TMPDIRTEMPTMP 环境变量。因此,不能保证生成的文件名具有任何好的属性,例如,当通过 os.popen() .

如果有 后缀前缀dir 不是 None ,它们必须是同一类型。如果它们是字节,则返回的名称将是字节而不是str。如果要强制使用字节返回值,否则将使用默认行为,则传递 suffix=b'' .

如果 text 指定且为true时,文件将以文本模式打开。否则,(默认情况下)文件将以二进制模式打开。

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

提出一个 auditing event tempfile.mkstemp 带着论证 fullpath .

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

在 3.6 版更改: 这个 dir 参数现在接受 path-like object .

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

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

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

这个 前缀后缀dir 参数与for相同 mkstemp() .

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

提出一个 auditing event tempfile.mkdtemp 带着论证 fullpath .

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

在 3.6 版更改: 这个 dir 参数现在接受 path-like object .

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 此模块中定义的函数的参数。

如果 tempdirNone (默认)在调用上述任何函数时,除非 gettempprefix() 它是按照中描述的算法初始化的。 gettempdir() .

实例

以下是一些典型的 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

不推荐使用的函数和变量

创建临时文件的历史方法是首先使用 mktemp() 函数,然后使用此名称创建文件。很遗憾,这是不安全的,因为在调用 mktemp() 以及随后通过第一个进程创建文件的尝试。解决方案是结合这两个步骤并立即创建文件。此方法用于 mkstemp() 以及上述其他功能。

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

2.3 版后已移除: 使用 mkstemp() 相反。

返回调用时不存在的文件的绝对路径名。这个 前缀后缀dir 参数类似于 mkstemp() ,除了字节文件名, suffix=Noneprefix=None 不支持。

警告

使用此函数可能会在程序中引入一个安全漏洞。当你开始用它返回的文件名做任何事情时,其他人可能已经把你打得落花流水了。 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