当前位置: 首页 > news >正文

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)


http://www.mrgr.cn/news/28274.html

相关文章:

  • web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
  • Spring Boot框架:电商系统的技术革新
  • C#自定义特性-SQL
  • 10月月报 | Apache DolphinScheduler进展总结
  • DBeaver 连接 OceanBase Oracle 租户
  • python os.path.dirname(path) 详解
  • YOLOv9改进系列,YOLOv9损失函数更换为Powerful-IoU(2024年最新IOU),助力高效涨点
  • C语言 ——— 写一个宏,将一个整数的二进制位的奇数位和偶数位交换
  • transformer模型进行英译汉,汉译英
  • Qt ORM模块使用说明
  • 95-java synchronized和reentrantlock区别
  • 深入理解指针(三)
  • FLORR.IO 绿~粉(我是专业的!)
  • java项目常用的工具类
  • 数据技术革命来袭!从仓库到飞轮,企业数字化的终极进化!
  • 进阶SpringBoot之异步任务、邮件任务和定时执行任务
  • 使用NetworkManager代替wpa_supplicant管理网络
  • php部署到apach服务器上遇到的问题
  • 利士策分享,中秋佳节:月满人团圆的文化传承与演绎
  • Matlab生成prbs7的代码
  • 双指针算法专题(2)
  • 大模型参数高效微调技术原理综述(八)-MAM Adapter、UniPELT
  • 使用 SuperCraft AI 设计书橱模型的指南
  • 数据结构(2):LinkedList和链表[2]
  • python使用Pyvis库绘制B站评论互动网络结构图
  • Linux学习之路 - 线程概念补充理解