10.6. tempfileGenerate temporary files and directories

源程序代码:Lib/tempfile.py


本模块将生成临时文件和目录。它适用于所有支持的平台。

在2.3版本中,本模块被重构以增强其安全性。它现在提供了三种新功能, NamedTemporaryFile() mkstemp(),和mkdtemp(),这样应可消除剩余的所有需要使用不安全的mktemp()函数。不再通过此模块创建的临时文件名称包含进程 ID ;而使用了六个随机字符的字符串。

此外,所有用户可调用的函数现在都作出允许直接控制的位置和名称的临时文件的附加参数。它不再需要使用tempdir模板的全局变量。为了保持向后兼容性,参数顺序有几分奇怪 ;这被建议使用关键字参数为清楚起见。

模块定义以下用户调用的函数:

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

返回可以用作临时存储区域的文件类似对象。使用mkstemp()创建了该文件。一旦文件关闭 (包括对该对象进行垃圾回收时的隐式关闭),临时文件会立刻被销毁。在 Unix 环境下, 临时文件的目录条目会在文件被创建后立刻删除。其它平台不支持 ;您的代码不应依赖使用此函数具有或没有可见的名称在文件系统中创建一个临时文件。

Mode参数默认为'w + b'这样可以读取和写入不被关闭的情况下创建的文件。所以,它一贯表现在所有平台上而不存储的数据考虑使用二进制模式。bufsize默认为-1,意味着使用操作系统默认值。

Dir前缀后缀参数传递给mkstemp()

返回的对象是一个真正的文件对象 POSIX 平台上。在其他平台上,它是其文件属性是基础的真实文件对象的文件类似对象。with语句,就像一个正常的文件,可以使用这文件类似对象。

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

此函数操作完全像TemporaryFile()一样,只是保证该文件在文件系统中有一个可见的名称 (在 Unix 上,目录条目不是链接)。该名称可以从名称属性的文件对象的检索。是否可以使用名称来打开该文件的第二次,而命名的临时文件仍处于打开状态,不同的平台 (可以在 Unix 上如此使用 ; 它不能在 Windows NT 或更高版本)。如果删除为 true (默认值),尽快将其关闭,将删除该文件。

返回的对象始终是其文件属性是基础的真实文件对象的文件类似对象。with语句,就像一个正常的文件,可以使用这文件类似对象。

新版本 2.3。

新在 2.6 版本:删除的参数。

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

此函数操作完全像TemporaryFile()一样,不同之处在于数据后台在内存中,直到文件的大小超过max_size,或直到调用该文件的fileno()方法,此时内容写入到磁盘和运营收益与TemporaryFile()一样。此外,截断方法不接受大小参数。

生成的文件有一个附加的方法, rollover(),这将导致要翻身到无论其规模大小的磁盘上文件的文件。

返回的对象是其_file属性是一个StringIO对象或一个真正的文件对象,具体取决于是否被称为rollover()的文件类似对象。with语句,就像一个正常的文件,可以使用这文件类似对象。

在 2.6 版本新。

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

可能的最安全的方式创建一个临时文件。在该文件的创作中,假设该平台能够实现os 没有争用条件。O_EXCL os.open()标志。该文件是可读和可写的只能由创建的用户 id。如果该平台使用权限位指示文件是否可执行文件,该文件是由谁来执行的。文件描述符不由子进程继承。

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

如果指定后缀,则文件的名称将与该后缀结束,否则将无后缀。 mkstemp()不会在文件名和后缀之间加一个“.”,如果你需要它,请把它加在后缀的前面。

如果指定前缀,则文件的名称将与该前缀 ; 开始否则,将使用默认前缀。

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

如果指定了文本,它指示是否要在二元模式 (默认值) 或文本模式打开该文件。在一些平台上,这没有什么区别。

mkstemp()返回一个元组包含一个 OS 级别句柄到打开的文件 (如将返回的os.open()),该文件,请在该命令的绝对路径名。

新版本 2.3。

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

可能的最安全的方式创建一个临时目录。在该目录的创作中没有争用条件。该目录为可读、 可写的且可搜索只能由创建的用户 id。

Mkdtemp()的用户是负责删除临时目录及其内容看完。

前缀后缀dir参数有相同的mkstemp()

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

新版本 2.3。

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

从版本 2.3 开始弃用:使用mkstemp()来代替。

返回在进行调用的时间并不存在的文件的绝对路径名。前缀后缀dir参数有相同的mkstemp()

警告

使用此函数可能会引入一个在程序中的安全漏洞。你去做些什么的文件的名称,它将返回的时候,别人可能已经击败了你到拳打。 mktemp()使用可以轻松地替换成NamedTemporaryFile(),向它传递删除 = 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

本模块使用两个全局变量来告诉它如何构建一个临时名称。他们是在对任何上述职能的第一次调用初始化。调用方可能会改变,但这灰心丧气 ;使用适当的函数参数,来代替。

tempfile.tempdir

此变量设置为None以外的值时,此模块中定义的所有函数定义dir参数的默认值。

如果tempdir是取消设置或没有对任何上述函数的任何调用在 Python 搜索的目录和集tempdir到第一个调用的用户可以在其中创建文件的标准列表。列表是:

  1. The directory named by the TMPDIR environment variable.
  2. The directory named by the TEMP environment variable.
  3. The directory named by the TMP environment variable.
  4. A platform-specific location:
    • On RiscOS, the directory named by the Wimp$ScrapDir environment variable.
    • On Windows, the directories C:\TEMP, C:\TMP, \TEMP, and \TMP, in that order.
    • On all other platforms, the directories /tmp, /var/tmp, and /usr/tmp, in that order.
  5. As a last resort, the current working directory.
tempfile.gettempdir()

返回当前选定要在其中创建临时文件的目录。如果tempdir不是没有,这只是返回其内容 ;否则为执行了上面所述的搜索,并返回结果。

新版本 2.3。

tempfile.template

弃用以来 2.0 版本:使用gettempprefix()来代替。

设置为None以外的值时,此变量定义最后一个组成部分由mktemp()返回的文件名的前缀。六个随机字母和数字组成的字符串追加到要使文件名是唯一的前缀。默认前缀是tmp

此模块用于要求os.fork(); 调用后,该模板将设置为None的旧版本这已经不是必要自 1.5.2 版本。

tempfile.gettempprefix()

返回用于创建临时文件的文件名前缀。这不包含目录组件。使用此函数是首选的对直接读取模板变量。

在 1.5.2 版本新。