10.6. tempfile —生成临时文件和目录
源代码: Lib/tempfile.py
该模块生成临时文件和目录。它适用于所有受支持的平台。
在 Python 的 2.3 版中,对该模块进行了全面改进以增强安全性。现在,它提供了三个新函数NamedTemporaryFile(),mkstemp()和mkdtemp(),这将消除使用不安全的mktemp()函数的所有剩余需求。该模块创建的临时文件名不再包含进程 ID。而是使用六个随机字符组成的字符串。
而且,所有用户可调用函数现在都带有附加参数,这些参数允许直接控制临时文件的位置和名称。不再需要使用全局* tempdir 和 template *变量。为了保持向后兼容性,参数 Sequences 有些奇怪。为了清晰起见,建议使用关键字参数。
该模块定义了以下用户可调用的Function:
tempfile.
TemporaryFile
([[* mode ='w b'* [,* bufsize = -1 * [,后缀='' [,* prefix ='tmp'* [,* dir = None *]] []]]- 返回可以用作临时存储区的类似文件的对象。该文件是使用mkstemp()创建的。它将在关闭后立即销毁(包括在垃圾回收对象时的隐式关闭)。在 Unix 下,文件的目录条目在创建文件后立即被删除。其他平台不支持此Function。您的代码不应依赖使用此Function创建的临时文件,该临时文件在文件系统中是否具有可见名称。
-
mode *参数默认为
'w+b'
,因此可以在不关闭文件的情况下读写创建的文件。使用二进制模式,因此它在所有平台上均表现一致,而无需考虑存储的数据。 * bufsize *默认为-1
,这意味着使用 os 默认值。 -
dir , prefix 和 suffix *参数传递给mkstemp()。
返回的对象是 POSIX 平台上的真实文件对象。在其他平台上,它是一个类似文件的对象,其file
属性是基础真实文件对象。就像普通文件一样,可以在with语句中使用该文件状对象。
tempfile.
NamedTemporaryFile
([* mode ='w b'* [,* bufsize = -1 * [,后缀='' [,* prefix ='tmp'* [,* dir = None * [[,* delete = True *]] []]]]))- 该Function与TemporaryFile()完全相同,只是保证文件在文件系统中具有可见的名称(在 Unix 上,目录条目未取消链接)。可以从返回的类似文件的对象的
name
属性中检索该名称。在命名的临时文件仍处于打开状态时,是否可以使用该名称第二次打开文件,会因平台而异(可以在 Unix 上使用;在 Windows NT 或更高版本上不能使用)。如果* delete *为 true(默认设置),则在关闭文件后立即将其删除。
- 该Function与TemporaryFile()完全相同,只是保证文件在文件系统中具有可见的名称(在 Unix 上,目录条目未取消链接)。可以从返回的类似文件的对象的
返回的对象始终是类似文件的对象,其file
属性是基础真实文件对象。就像普通文件一样,可以在with语句中使用该文件状对象。
2.3 版的新Function。
2.6 版的新Function:* delete *参数。
tempfile.
SpooledTemporaryFile
([* max_size = 0 * [,* mode ='w b'* [,* bufsize = -1 * [,后缀='' [,前缀='tmp' [,* dir =无*]] []]]]))- 此函数的工作方式与TemporaryFile()完全相同,只是将数据假脱机到内存中,直到文件大小超过* max_size *为止,或者直到调用文件的
fileno()
方法为止,这时将内容写入磁盘,并且操作与TemporaryFile()相同。另外,它的truncate
方法不接受size
参数。
- 此函数的工作方式与TemporaryFile()完全相同,只是将数据假脱机到内存中,直到文件大小超过* max_size *为止,或者直到调用文件的
生成的文件还有另一种方法rollover()
,无论文件大小如何,该方法都会使该文件翻转到磁盘文件上。
返回的对象是类似文件的对象,其_file
属性是StringIO对象还是真实文件对象,具体取决于是否已调用rollover()
。就像普通文件一样,可以在with语句中使用该文件状对象。
2.6 版的新Function。
tempfile.
mkstemp
([后缀='' [,前缀='tmp' [,* dir = None * [,* text = False *]]]])
与TemporaryFile()不同,mkstemp()的用户负责在处理完临时文件后将其删除。
如果指定后缀,则文件名将以该后缀结尾,否则将没有后缀。 mkstemp()在文件名和后缀之间不加点;如果需要一个,请将其放在* suffix *的开头。
如果指定* prefix *,则文件名将以该前缀开头;否则,将使用默认前缀。
如果指定* dir ,则将在该目录中创建文件;否则,将在该目录中创建文件。否则,将使用默认目录。从与平台有关的列表中选择默认目录,但是应用程序的用户可以pass设置 TMPDIR , TEMP 或 TMP *环境变量来控制目录位置。因此,不能保证生成的文件名将具有任何不错的属性,例如,passos.popen()
传递给外部命令时不需要引用。
如果指定了* text *,则指示是以二进制模式(默认)还是以文本模式打开文件。在某些平台上,这没有区别。
mkstemp()返回一个 Tuples,该 Tuples 包含 os 级别的句柄到打开的文件(由os.open()返回)和该文件的绝对路径名(按此 Sequences)。
2.3 版的新Function。
tempfile.
mkdtemp
([后缀='' [,前缀='tmp' [,* dir =无*]]])- 以最安全的方式创建一个临时目录。目录的创建中没有竞争条件。该目录仅由创建用户 ID 可读,可写和可搜索。
mkdtemp()的用户负责在完成后删除临时目录及其内容。
- prefix , suffix 和 dir *参数与mkstemp()相同。
mkdtemp()返回新目录的绝对路径名。
2.3 版的新Function。
tempfile.
mktemp
([后缀='' [,前缀='tmp' [,* dir =无*]]])- 从 2.3 版开始不推荐使用:改为使用mkstemp()。
返回调用时不存在的文件的绝对路径名。 * prefix , suffix 和 dir *参数与mkstemp()相同。
Warning
使用此Function可能会在程序中引入安全漏洞。当您开始使用返回的文件名执行任何操作时,可能有人被您打败了。可以将delete=False
参数传递给NamedTemporaryFile(),从而轻松替换mktemp()用法:
>>> 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 *设置为调用用户可在其中创建文件的第一个目录。该列表为:
-
由
TMPDIR
环境变量命名的目录。 -
由
TEMP
环境变量命名的目录。 -
由
TMP
环境变量命名的目录。 -
特定于平台的位置:
-
在 RiscOS 上,该目录由
Wimp$ScrapDir
环境变量命名。 -
在 Windows 上,目录
C:\TEMP
,C:\TMP
,\TEMP
和\TMP
依次排列。 -
在所有其他平台上,目录
/tmp
,/var/tmp
和/usr/tmp
依次排列。 -
不得已时,使用当前工作目录。
-
tempfile.
gettempdir
( )- 返回当前选择的用于在其中创建临时文件的目录。如果tempdir不是
None
,则仅返回其内容;否则,返回 0.否则,执行上述搜索,并返回结果。
- 返回当前选择的用于在其中创建临时文件的目录。如果tempdir不是
2.3 版的新Function。
tempfile.
template
- 自 2.0 版起弃用:改为使用gettempprefix()。
当设置为None
以外的其他值时,此变量定义mktemp()返回的文件名的最后部分的前缀。前缀为六个随机字母和数字的字符串,以使文件名唯一。默认前缀是tmp
。
此模块的较旧版本过去要求在调用os.fork()之后将template
设置为None
;自版本 1.5.2 开始,此Function不再必要。
tempfile.
gettempprefix
( )- 返回用于创建临时文件的文件名前缀。它不包含目录组件。与直接读取* template *变量相比,使用此Function更可取。
版本 1.5.2 中的新Function。