Python如何使用临时文件和目录

liftword2个月前 (03-03)技术文章19

在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。

使用标准库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)

相关文章

最全RAR文件操作指南:如何用Python压缩、解压与筛选文件

引言:Python 对 .rar 文件进行压缩、解压以及筛选特定文件的操作代码封装一下import os import rarfile #todo 用于处理 RAR 文件 import zipfil...

20 天学 Python 文件操作:Day 8 压缩与解压文件

在日常开发中,压缩和解压文件是处理文件操作的常见需求。Python 提供了丰富的内置模块,比如 zipfile 和 shutil,让我们能够高效地压缩和解压文件。今天我们将学习如何使用这些模块进行操作...

Python全能压缩:ZIP的压缩、解压、文件筛选与删除,一键搞定!

引言:这个方法实现了文件压缩与解压的常见操作,涵盖内容如下:1、从文件夹创建 ZIP 文件 2、从文件夹创建 ZIP 文件(筛选特定文件) 3、解压 ZIP 文件中的所有内容 4、解压 ZIP...

python散装笔记——131: 解压文件

为了提取或解压缩tarball(tar归档文件)、ZIP文件或gzip文件,Python分别提供了tarfile、zipfile和gzip模块。Python的tarfile模块提供了TarFile.e...

15《Python 办公自动化教程》文件压缩与解压缩

压缩包也是我们平时工作中经常要接触到的文件格式,压缩文件后缀名通常有 .zip、.rar、.7z 等等。Python 中也有专门用来操作压缩包文件的第三方模块 zipfile。听这个名字就知道是用来操...

python压缩/解压gzip 大文件

最近处理线上日志,日志文件刚好是经过压缩的,且是gz后缀。自己便采用gzip库来处理。示例如下:创建gzip文件# -- coding: utf-8 -- import gzip """ 创建gzi...