Python编程基础 - 使用临时文件和临时目录
【导读】:本文先介绍了什么是临时文件,然后围绕Python内建模块
Temporary
讲解了如何管理和使用临时文件。
软件开发过程中有时会遇到遇到的某些文件只在一个相对较短的时间范围内有用的情况,这些文件即所谓临时文件。对于这些文件我么甚至不关心他们叫什么,毕竟他们仅仅在其生命周期内产生特定的作用。当他们不再有用时,如果还残留在计算机中,就成为了所谓的垃圾文件。
对于程序设计者而言,我们当然不想每一次都为这些琐碎的文件都起一个名字,指定一个存储路径,然后去找寻使用该文件,并最后还要通过代码或者手动的方式去删除他们。因此,一个专门管理和使用临时目录及文件的编程模块就显得必要。庆幸的是,在Python中已经为我们提供了这样一个模块——他就是tempfile
。无需额外安装,你可以直接将其导入在你的代码中以进行使用它所提供的相应接口:
import tempfile
该模块提供了图示的一些接口:
如果你只想导入其中的某个对象,那么也可以参照下面的写法完成导入:
from tempfile import TemporaryFile, TemporaryDirectory
接下来,我们将详细了解该模块中的各个接口函数。
1.
TemporaryFile()
函数 - 用于创建临时文件。
- 文件将像mkstemp()函数所做的那样被创建。先看接口信息:
def TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None): """创建并返回一个临时文件 Arguments: 'prefix', 'suffix', 'dir' -- as for mkstemp. 'mode' -- io.open的模式参数 (默认为"w+b"). 'buffering' -- io.open的缓冲区大小参数 (默认为 -1). 'encoding' -- io.open的编码参数 (默认为 None) 'newline' -- io.open的换行符参数 (默认为 None) 'errors' -- io.open的errors参数 (默认为 None) 返回具有类似文件的接口的对象。该文件没有名称,关闭后将不再存在。 """
【示例1】使用TemporaryFile()创建临时文件(1)
import tempfile fp = tempfile.TemporaryFile() # 创建一个临时文件 fp.write(b'Hello world!') # 向该零时文件中写入一些数据 fp.seek(0) # 从文件中读取数据 fp.read()
Out[]:
b’Hello world!’
这时产生一个临时文件,你往往可能看不到它,但是它确实存在。且能够使用,正像上述代码中展示的那样。
fp.close()
关闭文件,这时该临时文件就自动删除了
【示例2】使用TemporaryFile()创建临时文件(2)—— 使用上下文管理器创建临时文件
# 使用上下文管理器创建临时文件 with tempfile.TemporaryFile() as fp: fp.write(b'Hello world!') fp.seek(0) data = fp.read() data
Out[]:
b’Hello world!’
运行至此文件将被自动地关闭并删除,这时使用上下文管理器的便利之处。
2.
TemporaryDirectory()
类 - 用于创建临时目录
创建并返回一个临时目录。这与mkdtemp()函数具有相同的行为(实际上TemporaryDirectory类初始化时将调用mkdtemp()函数
),但可以用作上下文管理器。
【示例3】使用TemporaryFile()创建临时目录
with tempfile.TemporaryDirectory() as tmpdirname: print('创建临时目录:', tmpdirname)
Out[]:
创建临时目录: C:\Users\JackLee\AppData\Local\Temp\tmpj4h3mfqn
同理,在上下文管理器中运行至此,该临时目录也已经被自动删除。
3.
NamedTemporaryFile()
函数 - 创建具有可见名称的临时文件
此函数执行的操作与 TemporaryFile() 完全相同,但确保了该临时文件在文件系统中具有可见的名称(在 Unix 上表现为目录条目不取消链接)。
- 从返回的文件类对象的 name 属性中可以检索到文件名。
- 在临时文件仍打开时,是否允许用文件名第二次打开文件,在各个平台上是不同的(在 Unix 上可以,但在 Windows NT 或更高版本上不行)。
- 如果 delete 为 true(默认值),则文件会在关闭后立即被删除。
- 该函数返回的对象始终是文件类对象 (file-like object),它的 file 属性是底层的真实文件对象。
- 文件类对象可以像普通文件一样在 with 语句中使用。
接口信息如下:
def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None): """创建并返回一个临时文件 参数表: 'prefix', 'suffix', 'dir': 传给mkstemp()函数所用的参数. 'mode': io.open的模式参数(默认为"w+b"). 'buffering': io.open的缓冲区大小参数 (默认为-1). 'encoding': io.open的编码参数 (默认为None) 'newline': io.open的换行符参数(默认为None) 'delete': 文件是否在关闭时被删除 (默认为True). 'errors': io.open的errors参数 (默认为None) 创建的文件正如mkstemp()函数所做的那样. 返回具有类似文件的接口的对象;文件的名称可作为其"name"属性访问。 文件关闭时将自动删除,除非"delete"参数设置为“False”。 """
4.
SpooledTemporaryFile()
函数 - 创建内存临时文件
此函数执行的操作与 TemporaryFile() 完全相同,但会将数据缓存在内存中,直到文件大小超过 max_size,或调用文件的 fileno() 方法为止,此时数据会被写入磁盘,并且写入操作与 TemporaryFile() 相同。
此函数生成的文件对象有一个额外的方法——rollover(),可以忽略文件大小,让文件立即写入磁盘。
5.
mkstemp()
函数 - 创建临时文件,但需要调用者自己删除之
- 其接口信息如下:
def mkstemp(suffix=None, prefix=None, dir=None, text=False): """用户可调用函数创建并返回一个唯一的临时文件。 返回值是一对(fd,name),其中fd是os.open返回的文件描述符,name是文件名。 如果'suffix'不是None, 文件名将以suffix结尾,否则没有suffix(后缀)。 如果'prefix'不是None, 文件名将以prefix开始,否则将使用一个默认的prefix(前缀) 如果'dir'不是None, 文件将在该目录(directory)中创建,否则将使用默认目录。 如果指定了'text'并且为True,则以文本模式打开文件。 否则(也是默认) 文件将以二进制形式打开. 如果'suffix', 'prefix' 和 'dir' 其中之一不是 None, 那么他们必须时一样的类型。 如果他们的类型为 bytes, 那么返回的name将是 bytes; str。 文件只能由创建用户标识来读写。如果操作系统使用权限位来指示文件是否可执行,则该文件不可由任何人执行。文件描述符不由该进程的子进程继承。 调用者自己需要负责删除文件。 """
6.
mkdtemp()
函数 - 创建临时目录,但需要调用者自己删除之
可以参考TemporaryDirectory
的用法。