On this page
tempfile —生成临时文件和目录
源代码: Lib/tempfile.py
该模块创建临时文件和目录。它适用于所有受支持的平台。 TemporaryFile,NamedTemporaryFile,TemporaryDirectory和SpooledTemporaryFile是提供自动清除的高级接口,可以用作上下文 Management 器。 mkstemp()和mkdtemp()是较低级别的Function,需要手动清除。
所有用户可调用的函数和构造函数都带有其他参数,这些参数允许直接控制临时文件和目录的位置和名称。此模块使用的文件名包括一串随机字符,这些字符串允许在共享的临时目录中安全地创建这些文件。为了保持向后兼容性,参数 Sequences 有些奇怪。为了清晰起见,建议使用关键字参数。
该模块定义了以下用户可调用的项目:
tempfile.
TemporaryFile
(* mode ='w b', buffering = None , encoding = None , newline = None , suffix = None , prefix = None , dir = None ,* , errors = None *)- 返回一个file-like object可用作临时存储区。使用与mkstemp()相同的规则安全地创建文件。它将在关闭后立即销毁(包括在垃圾回收对象时的隐式关闭)。在 Unix 下,该文件的目录条目要么根本没有创建,要么在创建文件后立即删除。其他平台不支持此Function。您的代码不应依赖使用此Function创建的临时文件,该临时文件在文件系统中是否具有可见名称。
生成的对象可以用作上下文 Management 器(请参见Examples)。在上下文完成或文件对象被破坏后,将从文件系统中删除临时文件。
mode *参数默认为
'w+b'
,因此可以在不关闭文件的情况下读写创建的文件。使用二进制模式,因此它在所有平台上均表现一致,而无需考虑存储的数据。 * buffering , encoding , errors 和 newline *的解释与open()相同。dir , prefix 和 suffix *参数的含义和默认值与mkstemp()相同。
返回的对象是 POSIX 平台上的真实文件对象。在其他平台上,它是一个类似文件的对象,其file
属性是基础真实文件对象。
os.O_TMPFILE标志(如果可用且可以使用)使用(特定于 Linux,需要 Linux 内核 3.11 或更高版本)。
用参数fullpath
引发auditing event tempfile.mkstemp
。
在版本 3.5 中更改:现在使用os.O_TMPFILE标志(如果有)。
在 3.8 版中进行了更改:添加了* errors *参数。
tempfile.
NamedTemporaryFile
(* mode ='w b', buffering = None , encoding = None , newline = None , suffix = None , prefix = None , dir = None , delete = True ,**,* errors = None *)- 该Function与TemporaryFile()完全相同,只是保证文件在文件系统中具有可见的名称(在 Unix 上,目录条目未取消链接)。可以从返回的类似文件的对象的
name
属性中检索该名称。在命名的临时文件仍处于打开状态时,是否可以使用该名称第二次打开文件,会因平台而异(可以在 Unix 上使用;在 Windows NT 或更高版本上不能使用)。如果* delete *为 true(默认设置),则在关闭文件后立即将其删除。返回的对象始终是类似文件的对象,其file
属性是基础真实文件对象。就像普通文件一样,可以在with语句中使用该文件状对象。
- 该Function与TemporaryFile()完全相同,只是保证文件在文件系统中具有可见的名称(在 Unix 上,目录条目未取消链接)。可以从返回的类似文件的对象的
用参数fullpath
引发auditing event tempfile.mkstemp
。
在 3.8 版中进行了更改:添加了* errors *参数。
tempfile.
SpooledTemporaryFile
(* max_size = 0 , mode ='w b', buffering = None , encoding = None , newline = None , suffix = None , prefix = None , dir = None ,**,* errors = None *)- 此函数的工作方式与TemporaryFile()完全相同,只是将数据假脱机到内存中,直到文件大小超过* max_size *为止,或者直到调用文件的
fileno()
方法为止,这时将内容写入磁盘,并且操作与TemporaryFile()相同。
- 此函数的工作方式与TemporaryFile()完全相同,只是将数据假脱机到内存中,直到文件大小超过* max_size *为止,或者直到调用文件的
生成的文件还有另一种方法rollover()
,无论文件大小如何,该方法都会使该文件翻转到磁盘文件上。
返回的对象是类似文件的对象,其_file
属性是io.BytesIO或io.TextIOWrapper对象(取决于是否指定了二进制或文本* mode *)或真实文件对象,具体取决于是否已调用rollover()
。就像普通文件一样,可以在with语句中使用该文件状对象。
在版本 3.3 中进行了更改:truncate 方法现在接受size
参数。
在 3.8 版中进行了更改:添加了* errors *参数。
tempfile.
TemporaryDirectory
(后缀=无,前缀=无,* dir =无*)
可以从返回的对象的name
属性中检索目录名称。当返回的对象用作上下文 Management 器时,如果存在name
,则将在with语句中将name
分配给as
子句的目标。
可以pass调用cleanup()
方法显式清除目录。
用参数fullpath
引发auditing event tempfile.mkdtemp
。
3.2 版中的新Function。
tempfile.
mkstemp
(后缀=无,前缀=无,* dir =无*,文本=假)
与TemporaryFile()不同,mkstemp()的用户负责在处理完临时文件后将其删除。
如果* suffix 不是None
,则文件名将以该后缀结尾,否则将没有后缀。 mkstemp()在文件名和后缀之间不加点;如果需要一个,请将其放在 suffix *的开头。
如果* prefix *不是None
,则文件名将以该前缀开头;否则,将使用默认前缀。缺省情况下,默认值为gettempprefix()或gettempprefixb()的返回值。
如果* dir 不是None
,则将在该目录中创建文件;否则,将使用默认目录。从与平台有关的列表中选择默认目录,但是应用程序的用户可以pass设置 TMPDIR , TEMP 或 TMP *环境变量来控制目录位置。因此,不能保证生成的文件名将具有任何不错的属性,例如,passos.popen()
传递给外部命令时不需要引用。
如果* suffix , prefix 和 dir *中的任何一个都不为None
,则它们必须是同一类型。如果它们是字节,则返回的名称将是字节而不是 str。如果要使用其他默认行为强制返回字节返回值,请传递suffix=b''
。
如果指定了* text *,则指示是以二进制模式(默认)还是以文本模式打开文件。在某些平台上,这没有区别。
mkstemp()返回一个 Tuples,该 Tuples 包含 os 级别的句柄到打开的文件(由os.open()返回)和该文件的绝对路径名(按此 Sequences)。
用参数fullpath
引发auditing event tempfile.mkstemp
。
在版本 3.5 中更改:现在可以以字节形式提供* suffix , prefix 和 dir 以获得字节返回值。在此之前,只允许使用 str。 后缀和前缀*现在接受并默认为None
,以导致使用适当的默认值。
在版本 3.6 中更改:* dir *参数现在接受path-like object。
tempfile.
mkdtemp
(后缀=无,前缀=无,* dir =无*)- 以最安全的方式创建一个临时目录。目录的创建中没有竞争条件。该目录仅由创建用户 ID 可读,可写和可搜索。
mkdtemp()的用户负责在完成后删除临时目录及其内容。
- prefix , suffix 和 dir *参数与mkstemp()相同。
mkdtemp()返回新目录的绝对路径名。
用参数fullpath
引发auditing event tempfile.mkdtemp
。
在版本 3.5 中更改:现在可以以字节形式提供* suffix , prefix 和 dir 以获得字节返回值。在此之前,只允许使用 str。 后缀和前缀*现在接受并默认为None
,以导致使用适当的默认值。
在版本 3.6 中更改:* dir *参数现在接受path-like object。
tempfile.
gettempdir
( )- 返回用于临时文件的目录的名称。这为该模块中所有函数的* dir *参数定义了默认值。
Python 搜索标准目录列表,以找到调用者可以在其中创建文件的目录。该列表为:
由
TMPDIR
环境变量命名的目录。由
TEMP
环境变量命名的目录。由
TMP
环境变量命名的目录。特定于平台的位置:
在 Windows 上,目录
C:\TEMP
,C:\TMP
,\TEMP
和\TMP
依次排列。在所有其他平台上,目录
/tmp
,/var/tmp
和/usr/tmp
依次排列。不得已时,使用当前工作目录。
此搜索的结果已缓存,请参见下面的tempdir的说明。
tempfile.
gettempdirb
( )- 与gettempdir()相同,但返回值以字节为单位。
3.5 版中的新Function。
tempfile.
gettempprefix
( )- 返回用于创建临时文件的文件名前缀。它不包含目录组件。
tempfile.
gettempprefixb
( )- 与gettempprefix()相同,但返回值以字节为单位。
3.5 版中的新Function。
该模块使用全局变量来存储用于gettempdir()返回的临时文件的目录名称。可以直接设置它以覆盖选择过程,但是不建议这样做。该模块中的所有函数都带有一个* dir *参数,该参数可用于指定目录,这是推荐的方法。
tempfile.
tempdir
- 当设置为
None
以外的其他值时,此变量将定义该模块中定义的函数的* dir *参数的默认值。
- 当设置为
如果在gettempprefix()以外的任何上述函数的任何调用中tempdir
是None
(默认值),则会按照gettempdir()中描述的算法进行初始化。
Examples
以下是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()和第一个进程随后try创建该文件之间的时间内,其他进程可能会使用该名称创建文件。解决方案是将两个步骤结合起来并立即创建文件。 mkstemp()和上述其他Function使用了这种方法。
tempfile.
mktemp
(后缀='',前缀='tmp',* dir =无*)- 从 2.3 版开始不推荐使用:改为使用mkstemp()。
返回调用时不存在的文件的绝对路径名。 * prefix , suffix 和 dir *参数类似于mkstemp(),但不支持字节文件名suffix=None
和prefix=None
。
Warning
使用此Function可能会在程序中引入安全漏洞。当您开始使用返回的文件名执行任何操作时,可能有人被您打败了。可以将delete=False
参数传递给NamedTemporaryFile(),从而轻松替换mktemp()用法:
>>> 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