You are here:  Home » Python » tempfile生成临时文件和目录(6)Python文件和目录访问模块(必读进阶Python教程)(参考资料)

该模块创建临时文件和目录。它适用于所有支持的平台。TemporaryFileNamedTemporaryFileTemporaryDirectory,和SpooledTemporaryFile是高级接口,其提供自动清理和可被用作上下文管理器。mkstemp()并且 mkdtemp()是需要手动清理的低级功能。

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

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

tempfile.TemporaryFilemode =’w + b’buffering = Noneencoding = Nonenewline = Nonesuffix = Noneprefix = Nonedir = None 
返回一个类似文件的对象,可以用作临时存储区域。使用与之相同的规则安全地创建文件mkstemp()。它将在关闭时被销毁(包括在对象被垃圾收集时隐式关闭)。在Unix下,文件的目录条目根本不是创建的,或者在创建文件后立即删除。其他平台不支持此功能; 您的代码不应该依赖于使用此函数创建的临时文件,该文件在文件系统中具有或不具有可见名称。

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

所述模式参数默认为'w+b'使得所创建的文件可以被读取并且没有被关闭写入。使用二进制模式,使其在所有平台上的行为一致,而不考虑存储的数据。 缓冲编码换行符被解释为 open()

目录前缀后缀的参数具有相同的含义和缺省值与mkstemp()

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

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

版本3.5中已更改:os.O_TMPFILE现在使用该标志(如果可用)。

tempfile.NamedTemporaryFilemode =’w + b’buffering = Noneencoding = Nonenewline = Nonesuffix = Noneprefix = Nonedir = Nonedelete = True 
TemporaryFile()除了保证文件在文件系统中具有可见名称外,此函数的运行方式与此完全相同(在Unix上,目录条目未取消链接)。可以从name返回的类文件对象的属性中检索该名称。名称是否可以用于第二次打开文件,而命名的临时文件仍然是打开的,因此不同平台(它可以在Unix上使用;它不能在Windows NT或更高版本上使用)。如果delete为true(默认值),则文件一关闭就会被删除。返回的对象始终是类文件对象,其file属性是底层的真实文件对象。类似文件的对象可以在with语句中使用,就像普通文件一样。
tempfile.SpooledTemporaryFilemax_size = 0mode =’w + b’buffering = Noneencoding = Nonenewline = Nonesuffix = Noneprefix = Nonedir = None 
此函数的运行方式与此完全相同TemporaryFile(),只是数据在内存中假脱机直到文件大小超过max_size,或者直到fileno()调用文件的方法,此时内容将写入磁盘并且操作继续进行 TemporaryFile()

生成的文件有一个额外的方法,rollover()使文件无论其大小如何都会转到磁盘文件。

返回的对象是一个类文件对象,其_file属性是一个io.BytesIOio.StringIO对象(取决于是否指定了二进制或文本模式)或真正的文件对象,具体取决于是否rollover()已被调用。类似文件的对象可以在with语句中使用,就像普通文件一样。

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

tempfile.TemporaryDirectory后缀=无前缀=无dir =无
此功能使用与之相同的规则安全地创建临时目录mkdtemp()。生成的对象可以用作上下文管理器(请参阅 示例)。完成上下文或销毁临时目录对象后,将从文件系统中删除新创建的临时目录及其所有内容。

可以从name返回的对象的属性中检索目录名称。当返回的对象用作上下文管理器时, nameaswith语句中将该子句的目标分配给该子句的目标(如果有)。

可以通过调用该cleanup()方法显式清除该目录 。

版本3.2中的新功能。

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

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

如果后缀不是None,则文件名将以该后缀结束,否则将没有后缀。 mkstemp()不在文件名和后缀之间加点; 如果你需要一个,把它放在后缀的开头。

如果前缀不是None,则文件名将以该前缀开头; 否则,使用默认前缀。默认值为gettempprefix()或的返回值(gettempprefixb()如果适用)。

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

如果后缀前缀目录中的任何一个不是 None,则它们必须是相同的类型。如果它们是字节,则返回的名称将是字节而不是str。如果要强制使用其他默认行为的字节返回值,则传递suffix=b''

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

mkstemp()将包含操作系统级句柄的元组返回到打开的文件(如将返回os.open())和该文件的绝对路径名,按此顺序。

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

tempfile.mkdtemp后缀=无前缀=无dir =无
尽可能以最安全的方式创建临时目录。目录的创建中没有竞争条件。该目录只能通过创建用户ID进行读取,写入和搜索。

用户mkdtemp()负责在完成后删除临时目录及其内容。

前缀后缀DIR参数是一样的 mkstemp()

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

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

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.mktempsuffix =”prefix =’tmp’dir = None 

从版本2.3开始不推荐使用:mkstemp()改为使用。

返回在进行调用时不存在的文件的绝对路径名。该前缀后缀DIR参数类似于那些mkstemp(),除了字节的文件名,suffix=None 并且prefix=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