16、Python如何使用临时文件和目录
在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。
使用标准库tempfile模块下的TemporaryFile对象,创建临时文件
使用TemporaryFile创建临时文件,不用命名,并且关闭的时候自动删除,此临时文件只能通过返回的文件对象f进行访问,不能通过系统文件路径访问;因此它只能通过当前进程进行访问。
TemporaryFile(mode = 'w+b', bufsize = '', suffix = '', prefix = 'tmp', dir = None, delete = True)
- mode:默认‘wb’权限;
- dir:这是文件创建使用的目录,这个非常又用,可以指定到一个比较空闲的磁盘上去;
- delete = True:默认为True,也就是说关闭文件时将其删除;可以定义delete = False,这样临时文件关闭时不会被删除;
from temfile imort TemporaryFile, NamedTemporaryFile
#创建临时文件
f = TemporaryFile()
#将临时数据写入临时文件
f.write('abcdefg' * 10000)
#访问临时数据
#将文件指针移到开始
f.seek(0)
#读取临时文件的前n字节
f.read(n)
使用标准库tempfile模块下的NamedTemporaryFile对象,创建临时文件
由于TemporaryFile临时文件不用命名,所以只能在当前进程访问,如果我们开启多进程需要访问同一个临时文件,如何处理呢?这时我们就要使用NamedTemporaryFile创建一个有名字的临时文件,这样就可以被多进程访问了。
NamedTemporaryFile(mode='wb', bufsize=-1, suffix='', prefix='tmp', dir=None, delete=True)
- mode:默认‘wb’权限;
- delete = True:默认为True,也就是说关闭文件时将其删除;可以定义delete = False,这样临时文件关闭时不会被删除;
import tempfile
from tempfile import TemporaryFile, NamedTemporaryFile
ntf = NamedTemporaryFile()
#ntf的属性:ntf.close、ntf.delete、ntf.name、ntf.close_called、ntf.file、ntf.unlink
#ntf的name属性,也就是临时文件在文件系统下的文件路径print(ntf.name)
# 临时文件名
print(tempfile.gettempdir())
# 存储目录 C:\Users\ADMINI~1\AppData\Local\Temp
print(tempfile.gettempprefix())
# 前缀 tmp,可以在NamedTemporaryFile中传参修改
假脱机模式高级临时文件对象创建函数:SpooledTemporaryfile
SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)
SpooledTemporaryFile()函数除了数据会在内存中进行假脱机外,与TemporaryFile()完全相同。直到文件大小超过max_size或直到调用文件的fileno()方法,此时使用与TemporaryFile()一样的操作,将内容写入磁盘。
该函数同样返回一个类文件对象,其_file属性可以是io.BytesIO(二进制模式)、io.TextIOWrapper(文本模式)对象或真实的文件对象(调用roller()函数)。同样的,这个类文件对象可以在with上下文管理中使用,就像普通文件一样。
该函数还有一个额外的方法rollover(),它使创建的文件滚寻磁盘上的内容,而不管其大小。SpooledTemporaryFile函数的调用格式与TemporaryFile()函数一样,这里就不介绍了。
TemporaryDirectory创建临时目录
除了可以创建临时文件,而有些场景下,我们需要创建临时文件夹,这可以基于TemporaryDirectory()来实现,比如生成一个压缩包。
TemporaryDirectory类用于创建临时目录,目录及其内容使用完毕后会被自动删除。
import tempfile
import shutil
import zipfile# 创建临时目录
with tempfile.TemporaryDirectory() as temp_dir:# 在临时目录中创建一些文件with open(f"{temp_dir}/file1.txt", 'w') as f:f.write("Hello, World!")with open(f"{temp_dir}/file2.txt", 'w') as f:f.write("Hello, Python!")# 创建压缩包with zipfile.ZipFile(f"{temp_dir}/files.zip", 'w') as zip_file:for root, dirs, files in os.walk(temp_dir):for file in files:file_path = os.path.join(root, file)if file_path != zip_file.filename: # 排除压缩包本身zip_file.write(file_path, os.path.relpath(file_path, temp_dir))# 临时目录现在已经被删除,压缩包仍然存在
使用mkdtemp与mkstemp
当需要更细粒度的控制时,可以使用mkdtemp和mkstemp函数。这两个函数分别用于创建临时目录和临时文件,且不会自动删除创建的目录或文件。
import tempfile
import os
# 创建临时目录
tempdir = tempfile.mkdtemp()
print('Temporary directory:', tempdir)
# 创建临时文件
fd, temp_file_path = tempfile.mkstemp(suffix='.txt', dir=tempdir)
os.close(fd)
print('Temporary file:', temp_file_path)
# 清理资源
os.remove(temp_file_path)
os.rmdir(tempdir)