【tempfile】
惊奇地又发现了一个比较有意思的小模块。
在一些场景中我们经常需要自动生成一些临时文件,当然用简单的open函数,来创建一个隐藏文件可以实现。不过tempfile这个模块把一些有的没的功能全部都封装完毕。我们直接使用即可。
■ 简单使用
from tempfile import TemporaryFile temp = TemporaryFile()
print temp
print temp.name '''
TemporaryFile类的构造方法,其返回的还是一个文件对象。但这个文件对象特殊的地方在于
1. 对应的文件没有文件名,对除了本程序之外的程序不可见
2. 在被关闭的同时被删除
所以上面的两句打印语句,输出分别是一个文件对象,以及一个<fdopen>(并不是文件名)
'''
# 向临时文件中写入内容
temp.write('hello\nworld') # ...一些操作之后需要读取临时文件的内容了
temp.seek(0) # 从头读取,和一般文件对象不同,seek方法的执行不能少
print temp.read() temp.close() # 关闭文件的同时删除文件
TemporaryFile类是tempfile中最常用的类之一,其目的就在于提供一个统一的临时文件调用接口,读写临时文件,并且保证临时文件的隐形性。这个类的构造方法和一般的文件对象很类似:tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])。可以看到默认的打开模式是w+b,但是和一般通过wb模式打开的文件对象不同之处在于,正如上面所示它也可以用于读取文件。
在TemporaryFile类的基础上又衍生出了两个更加精细化的类用来处理。NamedTemporaryFile类是在前者的基础上,初始化时加上了delete参数,默认值为True。当此参数为True时和TemporaryFile类完全一致。如果是False,那么临时文件对象在被关闭时不会删除。因此可以在下面的代码中通过同样的对象再次打开。
另一个是SpooledTemporaryFile,它在TemporaryFile的基础上增加了一个max_size参数默认值为0。当这个类的对象调用write方法向临时文件中写入内容时,这些内容暂时先存在于缓存中,只有当内容大小达到了max_size指定的大小(经试验应该不是这样的,存疑)
● 创建临时文件夹
tempfile中还有创建临时目录的功能。比如tempfile.mkdtemp方法。这个方法做的事情是在系统指定的临时目录下(比如TEMP,TEMPDIR这些环境变量指向的目录)创建一个临时目录,可以指出一个标识名让目录名中包含这个标识名。方法返回的是新创建的临时目录的路径。