文章目录(Table of Contents)
简介
在一些场景中我们经常需要自动生成一些临时文件,当然我们可以使用 open 函数,来创建一个隐藏文件。不过 tempfile
这个模块把常用的功能全部都封装完毕,我们直接使用即可。
例如我们可以使用 tempfile 创建一个只对某个程序使用的隐藏文件,同时这个程序关闭后文件会自动删除。我们也可以创建一个文件被多个进程或主机使用。需要注意的是,不要去找临时文件或临时文件夹,因为程序退出时该临时文件和临时文件夹都会被删除。在这一篇中,我们会介绍关于 tempfile
模块的使用。
参考资料
tempfile 的简单使用
使用 TemporaryFile 创建临时文件
TemporaryFile 类是 tempfile 中最常用的类之一。使用 TemporaryFile 创建的临时文件有以下的特征:
- 对应的文件没有文件名,对除了本程序之外的程序不可见;
- 在被关闭的同时被删除;
下面我们看一个简单的例子,新建一个临时文件,写入「hello world」内容,然后将其打印出来:
- import tempfile
- temp_file = tempfile.TemporaryFile()
- print(temp_file.name) # 打印文件路径
- # 写入临时文件
- temp_file.write(b'hello, world') # 写入内容
- # 读取临时文件内容
- temp_file.seek(0) # 从头读取,和一般文件对象不同,seek方法的执行不能少
- print(temp_file.read())
- # 关闭文件的同时删除文件
- temp_file.close()
上面一种方法是手动创建文件,对文件读写之后再手动进行关闭。我们也可以使用 with 语句来创建临时文件,这样不需要考虑手动关闭。下面是使用「with」来创建临时文件的例子:
- import tempfile
- with tempfile.TemporaryFile() as temp_file:
- # 写入内容
- temp_file.write('两情若是久长时,'.encode('utf-8'))
- temp_file.write('又岂在朝朝暮暮。'.encode('utf-8'))
- # 将文件指针移到开始处,准备读取文件
- temp_file.seek(0)
- # 读取文件内容
- print(temp_file.read().decode('utf-8'))
在 TemporaryFile 类的基础上有两个衍生的类:
NamedTemporaryFile
类是在前者的基础上,初始化时加上了 delete 参数,默认值为 True。当此参数为 True 时和 TemporaryFile 类完全一致。如果是 False,那么临时文件对象在被关闭时不会删除。因此可以在下面的代码中通过同样的对象再次打开。- 另一个是
SpooledTemporaryFile
,它在 TemporaryFile 的基础上增加了一个 max_size 参数默认值为 0。当这个类的对象调用 write 方法向临时文件中写入内容时,这些内容暂时先存在于缓存中,只有当内容大小达到了 max_size 指定的大小,才会写入文件。
使用 mkdtemp 创建临时文件夹
tempfile 中还有创建临时目录的功能,如 tempfile.mkdtemp
方法。这个方法做的事情是在系统指定的临时目录下(比如TEMP,TEMPDIR这些环境变量指向的目录)创建一个临时目录。下面是一个创建「临时文件夹」的例子,我们在这个「临时文件夹」下在生成多个「临时文件」,并写入内容。
- import tempfile
- with tempfile.TemporaryDirectory() as tmpdirname:
- print('创建临时目录', tmpdirname)
- with tempfile.TemporaryFile(dir=tmpdirname) as f1, tempfile.TemporaryFile(dir=tmpdirname) as f2:
- # 写入内容
- f1.write(b'The First File.')
- f2.write(b'The Second File.')
- # 文件指针移动到开始处
- f1.seek(0)
- f2.seek(0)
- # 读取文件内容
- print('文件一 {}, {}'.format(f1.name, f1.read()))
- print('文件二 {}, {}'.format(f2.name, f2.read()))
上面的代码最终运行结果如下所示,可以看到两个「临时文件」在创建的「临时文件夹」内:
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论