10.6. tempfile — 生成临时文件和目录 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/tempfile
跳转至:导航、​搜索

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

源代码: :source:`Lib/tempfile.py`



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

在 Python 2.3 版中,为了增强安全性,对该模块进行了大修。 它现在提供了三个新函数,NamedTemporaryFile()mkstemp()mkdtemp(),这应该消除所有剩余的需要使用不安全的 ]mktemp() 函数。 此模块创建的临时文件名不再包含进程 ID; 而是使用了一个由六个随机字符组成的字符串。

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

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

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

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

mode参数默认为'w+b',这样创建的文件不关闭就可以读写。 使用二进制模式使其在所有平台上的行为一致,而不考虑存储的数据。 bufsize 默认为 -1,表示使用操作系统默认值。

dirprefixsuffix 参数传递给 mkstemp()

返回的对象是 POSIX 平台上的真实文件对象。 在其他平台上,它是一个类文件对象,其 file 属性是底层真正的文件对象。 这个类文件对象可以在 with 语句中使用,就像普通文件一样。

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

该函数的操作与 TemporaryFile() 完全一样,除了文件保证在文件系统中具有可见的名称(在 Unix 上,目录条目未取消链接)。 可以从返回的类文件对象的 name 属性中检索该名称。 在命名的临时文件仍处于打开状态时,是否可以使用该名称再次打开该文件,因平台而异(在 Unix 上可以如此使用;在 Windows NT 或更高版本上则不能)。 如果 delete 为真(默认值),文件一关闭就会被删除。

返回的对象始终是一个类文件对象,其 file 属性是底层的真实文件对象。 这个类文件对象可以在 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() 一样继续。 此外,它的 truncate 方法不接受 size 参数。

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

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

2.6 版中的新功能。

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

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

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

如果指定了suffix,文件名将以该后缀结尾,否则没有后缀。 mkstemp() 文件名和后缀之间不加点; 如果需要的话,把它放在后缀的开头。

如果指定了 prefix,则文件名将以该前缀开头; 否则,将使用默认前缀。

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

如果指定了text,则表示是以二进制方式(默认)还是文本方式打开文件。 在某些平台上,这没有区别。

mkstemp() 返回一个包含操作系统级句柄的元组到一个打开的文件(由 os.open() 返回)和该文件的绝对路径名,在那个命令。

2.3 版中的新功能。

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

以最安全的方式创建临时目录。 目录的创建中没有竞争条件。 该目录只能通过创建用户 ID 进行读取、写入和搜索。

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

prefixsuffixdir 参数与 mkstemp() 的参数相同。

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

2.3 版中的新功能。

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

自 2.3 版起已弃用: 改用 mkstemp()

返回调用时不存在的文件的绝对路径名。 prefixsuffixdir 参数与 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

该模块使用一个全局变量来告诉它如何构造一个临时名称。 它们在第一次调用上述任何函数时被初始化。 调用者可能会更改它们,但不鼓励这样做; 而是使用适当的函数参数。

tempfile.tempdir

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

如果 tempdir 未设置或 None 在对上述任何函数的任何调用中,Python 将搜索标准目录列表并将 tempdir 设置为调用用户的第一个目录可以在里面创建文件。 名单是:

  1. TMPDIR 环境变量命名的目录。

  2. TEMP 环境变量命名的目录。

  3. TMP 环境变量命名的目录。

  4. 特定于平台的位置:

    • 在 RiscOS 上,由 Wimp$ScrapDir 环境变量命名的目录。

    • 在 Windows 上,目录 C:\TEMPC:\TMP\TEMP\TMP,按此顺序。

    • 在所有其他平台上,目录 /tmp/var/tmp/usr/tmp,按此顺序。

  5. 作为最后的手段,当前工作目录。

tempfile.gettempdir()

返回当前选择的目录以在其中创建临时文件。 如果 tempdir 不是 None,则只返回其内容; 否则,执行上述搜索,并返回结果。

2.3 版中的新功能。

tempfile.template

自 2.0 版起已弃用: 改用 gettempprefix()

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

该模块的旧版本过去要求在调用 os.fork() 后将 template 设置为 None; 从 1.5.2 版开始就不需要了。

tempfile.gettempprefix()

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

1.5.2 版中的新功能。