临时文件tempfile
临时文件tempfile
1.概述
安全地创建具有唯一名称的临时文件,以至于他们不会被那些想破坏或者窃取数据的人猜出是非常有挑战性的。tempfile 模块提供了几个安全地创建系统临时文件的方法。 TemporaryFile() 打开并返回一个未命名的临时文件, NamedTemporaryFile() 打开并返回一个命名临时文件,SpooledTemporaryFile 会在将数据写入磁盘之前将内容保存在内存中,TemporaryDirectory 是一个上下文管理器,它会在上下文关闭的时候移除目录。
2.临时文件TemporaryFile
如果需要临时文件来存储数据,而不需要与其他程序共享这些文件,可以使用TemporaryFile
创建临时文件,它创建的文件其他程序是不能找到或打开的,因为这个文件在系统表中根本没有对它的引用。不论通过close还是with语句,关闭文件时都会自动删除这个文件。
2.1.创建临时文件
这个例子展示了采用不同方法创建临时文件的差别,一种做法是使用常规方式构建一个临时文件的文件名称,另一种是使用TemporaryFile
函数创建临时文件,它返回的文件没有名称并且with语句结束后自动删除临时文件。
import os
import tempfileprint('Building a filename with PID:')
filename = '/tmp/guess_my_name.{}.txt'.format(os.getpid())
with open(filename, 'w+b') as temp:print('temp:')print(' {!r}'.format(temp))print('temp.name:')print(' {!r}'.format(temp.name))# 自己手动清除临时文件
os.remove(filename)print()
print('TemporaryFile:')
with tempfile.TemporaryFile() as temp:print('temp:')print(' {!r}'.format(temp))print('temp.name:')print(' {!r}'.format(temp.name))# 自动清除文件
运行代码,使用TemporaryFile函数创建临时文件比常规方法要简单,而且文件名不会重复,关闭时自动删除临时文件。
Building a filename with PID:
temp:<_io.BufferedRandom name='/tmp/guess_my_name.60756.txt'>
temp.name:'/tmp/guess_my_name.60756.txt'TemporaryFile:
temp:<_io.BufferedRandom name=3>
temp.name:3
2.2.读写临时文件
1.字节模式读写
TemporaryFile默认使用w+b模块创建文件,方便在所有平台表现一致。允许调用者读写这个文件。
向文件写入内容后,需要执行seek函数,才能从临时文件中读取到内容。
import os
import tempfilewith tempfile.TemporaryFile() as temp:# 写入内容temp.write(b'Some data')# 刷新temp.seek(0)# 读取内容print(temp.read())
b'Some data'
2.文本模式读写
要使用文本模式读写文件内容,TemporaryFile创建临时文件时设置模式为w+t
import tempfilewith tempfile.TemporaryFile(mode='w+t') as f:f.writelines(['first\n', 'second\n'])f.seek(0)for line in f:print(line.rstrip())
运行结果,输出文本类型
first
second
3.命名临时文件NamedTemporaryFile
在某些情况下,命名临时文件很重要。对于跨进程甚至跨主机应用程序来说,应用程序各部分之间最简单的数据传递方式是命名文件。 NamedTemporaryFile() 方法会创建一个文件,但不会取消链接,所以它会保留名称(可以通过 name 属性读取)。
import os
import pathlib
import tempfilewith tempfile.NamedTemporaryFile() as temp:print('temp:')print(' {!r}'.format(temp))print('temp.name:')print(' {!r}'.format(temp.name))f = pathlib.Path(temp.name)# with语句执行完,临时文件自动删除
print('Exists after close:', f.exists())
运行结果
temp:<tempfile._TemporaryFileWrapper object at 0x1047e9600>
temp.name:'/var/folders/2k/c77m3hts5l50dj09vc3mw74r0000gn/T/tmpx37l6m04'
Exists after close: False
4.假脱机文件
临时文件如果保存数据相对较小时,使用 SpooledTemporaryFile 可能效率更高,因为它在内容数量超过阈值之前,使用 io.BytesIO 或者 io.StringIO 将数据保存到内存中。当数据量超过阈值之后,数据将会被写入磁盘保存,与此同时,缓冲池也会被替换为 TemporaryFile()。
import tempfilewith tempfile.SpooledTemporaryFile(max_size=100,mode='w+t',encoding='utf-8') as temp:print('temp: {!r}'.format(temp))for i in range(3):temp.write('This line is repeated over and over.\n')print(temp._rolled, temp._file)
运行结果
temp: <tempfile.SpooledTemporaryFile object at 0x1096dda50>
False <_io.TextIOWrapper encoding='utf-8'>
False <_io.TextIOWrapper encoding='utf-8'>
True <_io.TextIOWrapper name=3 mode='w+t' encoding='utf-8'>
也可以显式调用 rollover() 或者 fileno() 方法将数据写入到磁盘
import tempfilewith tempfile.SpooledTemporaryFile(max_size=1000,mode='w+t',encoding='utf-8') as temp:print('temp: {!r}'.format(temp))for i in range(3):temp.write('This line is repeated over and over.\n')print(temp._rolled, temp._file)print('rolling over')temp.rollover()print(temp._rolled, temp._file)
运行代码,调用rollover()方法在磁盘上创建文件。
temp: <tempfile.SpooledTemporaryFile object at 0x103756a10>
False <_io.TextIOWrapper encoding='utf-8'>
False <_io.TextIOWrapper encoding='utf-8'>
False <_io.TextIOWrapper encoding='utf-8'>
rolling over
True <_io.TextIOWrapper name=3 mode='w+t' encoding='utf-8'>
5.临时目录TemporaryDirectory
当需要几个临时文件的时候,使用 TemporaryDirectory 创建一个临时目录并打开所有文件可能会更方便。
import pathlib
import tempfilewith tempfile.TemporaryDirectory() as directory_name:the_dir = pathlib.Path(directory_name)print(the_dir)a_file = the_dir / 'a_file.txt'a_file.write_text('This file is deleted.')print('Directory exists after?', the_dir.exists())
print('Contents after:', list(the_dir.glob('*')))
运行代码,上下文管理器创建了目录,在上下文块里创建文件。上下文结束后会自动删除临时目录和文件
/var/folders/2k/c77m3hts5l50dj09vc3mw74r0000gn/T/tmpr9uxk9yz
Directory exists after? False
Contents after: []
6.预测名
虽然生成的临时文件名称中包含可预测部分比起严格匿名文件安全性较低,但可以找到该文件并对其进行检查以用于调试。
到目前讲述的所有方法都采用三个参数在一定程度上控制文件名,名称生成规则如下:
prefix前缀和suffix后缀参数与一个随机的字符串结合起来建立文件名,dir参数保持不变,作为新文件的位置。
dir + prefix + random + suffix
import tempfilewith tempfile.NamedTemporaryFile(suffix='_suffix',prefix='prefix_',dir='/tmp') as temp:print('temp:')print(' ', temp)print('temp.name:')print(' ', temp.name)
运行结果
temp:<tempfile._TemporaryFileWrapper object at 0x10cc8fdc0>
temp.name:/tmp/prefix_bg25ttl5_suffix
7.临时文件位置
如果没有显式地使用 dir 参数设置临时文件存放的目录,那么临时文件存放的位置将基于操作系统设置。tempfile 模块提供了两个方法用于在运行时查询这个设置。
gettempdir() 方法返回默认的临时文件存放位置, gettempprefix() 返回新临时文件和目录名称的前缀。
gettempdir() 通过直接查询一个列表用来确定当前进程新创建文件的存放位置。搜索的列表依次是:
- 环境变量:TMPDIR
- 环境变量:TEMP
- 环境变量:TMP
- 系统备选值。( Windows 上采取 C:\temp, C:\tmp, \temp, 或者 \tmp 中的第一个可用值。其他平台使用 /tmp, /var/tmp, 或者 /usr/tmp 。)
如果以上都不可用,那么就会使用当前目录。
import tempfileprint('gettempdir():', tempfile.gettempdir())
print('gettempprefix():', tempfile.gettempprefix())
运行结果
gettempdir(): /var/folders/2k/c77m3hts5l50dj09vc3mw74r0000gn/T
gettempprefix(): tmp
如果需要使用一个全局目录存储所有临时文件且不依赖环境变量的程序应该手动设置 tempfile.tempdir ,直接给其赋值即可。
import tempfiletempfile.tempdir = '/I/changed/this/path'
print('gettempdir():', tempfile.gettempdir())
运行结果
gettempdir(): /I/changed/this/path
相关文章:
临时文件tempfile
临时文件tempfile 1.概述 安全地创建具有唯一名称的临时文件,以至于他们不会被那些想破坏或者窃取数据的人猜出是非常有挑战性的。tempfile 模块提供了几个安全地创建系统临时文件的方法。 TemporaryFile() 打开并返回一个未命名的临时文件, NamedTemp…...
vue3封装数值动态递增组件
vue3封装数值动态递增组件前言源码举个例子:前言 1)使用技术: vue3.2 Ts 2)组件接收参数: 参数类型意义是否可选valuenumber数值大小必填durationnumber递增动画持续时间(单位:s)…...
JavaWeb_RequestResponse
目录 一、概述 二、Request对象 1.Request继承体系 2.Request获取请求数据 ①获取请求行数据 ②获取请求头数据 ③获取请求体数据 ④获取请求参数 3.Request请求转发 三、Response 1.Response设置响应数据功能 ①响应行 ②响应头 ③响应体 2.请求重定向 3.路径问…...
C语言刷题——“C”
各位CSDN的uu们你们好呀,今天,小雅兰要巩固一下之前学过的知识,那么,最好的复习方式就是刷题啦,现在,我们就进入C语言的世界吧 从最简单的开始噢 完完全全零基础都能看懂 题目来源于牛客网 编程语言初学训…...
【刷题】搜索——BFS:城堡问题(The Castle)
目录题目代码(Flood Fill)代码(并查集)题目 题目链接 找出房间个数——>求连通块个数 最大房间——>求最大连通块 直接用flood fill算法 注意题目的输入,例如118211182111821,则代表有西、北、南墙…...
深度学习——torch相关函数用法解析
1. torch.ones() torch.ones(*sizes, outNone) → Tensor函数功能:返回一个全为1 的张量,形状由可变参数sizes定义。 参数: sizes (int…) – 整数序列,定义了输出形状 out (Tensor, optional) – 结果张量 例子: >>> …...
ubuntu 20使用kubeadm安装k8s 1.26
步骤 机器:4核8G,root账号,可访问互联网 1、更新apt apt-get update 2、安装一些基本工具 apt-get install ca-certificates curl gnupg lsb-release net-tools apt-transport-https 3、ifconfig 获取ip,hostname获取主机名&…...
低代码开发平台|制造管理-生产过程管理搭建指南
1、简介1.1、案例简介本文将介绍,如何搭建制造管理-生产过程。1.2、应用场景先填充工序信息,再设置工艺路线对应的工序;工序信息及工艺路线列表报表展示的是所有工序、工艺路线信息,可进行新增对应数据的操作。2、设置方法2.1、表…...
python对多个csv文件进行合并(表头需一致)
之前写过python对【多个Excel文件】中的【单个sheet】进行合并,参考:点我 之前也写过python对【多个Excel文件】中的【多个sheet】进行合并,参考:点我 今天再写一个python对多个csv格式的文件进行合并的小工具 但是大家切记&am…...
Salesforce Apex调用邮件模板
正常调用无模板:mail.setToAddresses(new List<String>{user.Email});//mail.setReplyTo(444298824qq.com);//mail.setCcAddresses(null);mail.setSenderDisplayName(EOP系统);mail.setSubject(EOP通知(待审批):您有未处理的…...
windows本地开发Spark[不开虚拟机]
1. windows本地安装hadoop hadoop 官网下载 hadoop2.9.1版本 1.1 解压缩至C:\XX\XX\hadoop-2.9.1 1.2 下载动态链接库和工具库 1.3 将文件winutils.exe放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.4 将文件hadoop.dll放在目录C:\XX\XX\hadoop-2.9.1\bin下 1.5 将文件hadoop.dl…...
一文教你快速估计个股交易成本
交易本身对市场会产生影响,尤其是短时间内大量交易,会影响金融资产的价格。一个订单到来时的市场价格和订单的执行价格通常会有差异,这个差异通常被称为交易成本。在量化交易的策略回测部分,不考虑交易成本或者交易成本估计不合理…...
Leetcode—移除元素、删除有序数组中的重复项、合并两个有序数组
移除元素 此题简单,用双指针方法即可, 如果右指针指向的元素不等于val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移; 如果右指针指向的元素等于 val&…...
面试(十)大疆 安全开发 C++1面
1. 在C++开发中定义一个变量,若不做初始化直接使用会怎样? 如果该变量是一个普通变量,则如果对其进行访问,会返回一个随机值,int类型不一定为0,bool类型也不一定为false 如果该变量为一个静态变量,则初始值都是一个0; 如果该变量是一个指针,那么在后续程序运行中很…...
短信链接跳转微信小程序
短信链接跳转微信小程序1 实现方案1.1 通过URL Scheme实现1.2 通过URL Link实现1.3 通过云开发静态网站实现2 实现方案对比3 实践 URL Schema 方案3.1 获取微信access_token3.2 获取openlink3.3 H5页面(模拟短信跳转,验证ok)4 问题小节4.1 io…...
吉林电视台启用乾元通多卡聚合系统广电视频传输解决方案
随着广播电视数字化、IP化、智能化的逐步深入,吉林电视台对技术改造、数字设备升级提出了更高要求,通过对系统性能、设计理念的综合评估,正式启用乾元通多卡聚合系统广电视频传输解决方案,将用于大型集会、大型演出、基层直播活动…...
Linux常用命令1
目录1、远程登陆服务器2、文件相关(1)文件和目录属性(2)创建目录mkdir(3)删除目录rmdir(4)创建文件touch(5)删除文件或目录rm(6)ls命令…...
【C++进阶】一、继承(总)
目录 一、继承的概念及定义 1.1 继承概念 1.2 继承定义 1.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、菱形继承及菱形虚拟继承 7.1 继承的分类 7.2 菱形虚拟…...
AttributeError: module ‘lib‘ has no attribute ‘OpenSSL_add_all_algorithms
pip安装crackmapexec后,运行crackmapexec 遇到报错 AttributeError: module lib has no attribute OpenSSL_add_all_algorithms 直接安装 pip3 install crackmapexec 解决 通过 python3 -m pip install --upgrade openssl 或者 python3 -m pip install openssl>22.1.…...
Python实现视频自动打码功能,避免看到羞羞的画面
前言 嗨呀嗨呀,最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就会看到一堆马赛克,由于太好奇了就找了一下原因,结果是因为某艺人塌房了…虽然但是 看综艺的时候满影响美观的 咳咳,这里我可不是来教你们如何解…...
说说Knife4j
Knife4j是一款基于Swagger2的在线API文档框架使用Knife4j, 需要 添加Knife4j的依赖当前建议使用的Knife4j版本, 只适用于Spring Boot2.6以下版本, 不含Spring Boot2.6 在主配置文件(application.yml)中开启Knife4j的增强模式必须在主配置文件中进行配置, 不要配置在个性化配置文…...
Java学习笔记-03(API阶段-2)集合
集合 我们接下来要学习的内容是Java基础中一个很重要的部分:集合 1. Collection接口 1.1 前言 Java语言的java.util包中提供了一些集合类,这些集合类又称之为容器 提到容器不难想到数组,集合类与数组最主要的不同之处是,数组的长度是固定的,集合的长度是可变的&a…...
「3」线性代数(期末复习)
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 矩阵的秩 定义4:在mxn矩阵A中,任取k行与k列(k<m,k<n),位…...
【CSDN竞赛】27期题解(Javascript)
前言 本来排名是20的,不过第一题有点输出bug,最后实际测出来又重新排名,刚好卡在第10。但是考试报告好像过了12小时就下载不到了,所以就只写题目求解的JS函数吧。 1. 幸运数字 小艺定义一个幸运数字的标准包含3条: 仅包含4或7幸…...
高压放大器在骨的逆力电研究中的应用
实验名称:高压放大器在骨的逆力电研究中的应用研究方向:生物医学测试目的:骨中的胶原和羟基磷灰石沿厚度分布不均匀,骨试样在直流电压作用下,内部出现传导电流引起试样内部温度升高,不同组分热变形不一致&a…...
思科网络部署,(0基础)入门实验,超详细
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...
private static final Long serialVersionUID= 1L详解
我们知道在对数据进行传输时,需要将其进行序列化,在Java中实现序列化的方式也很简单,可以直接通过实现Serializable接口。但是我们经常也会看到下面接这一行代码,private static final Long serialVersionUID 1L;这段代…...
若依前后端分离版集成nacos
根据公司要求,需要将项目集成到nacos中,当前项目是基于若依前后端分离版开发的,若依的版本为3.8.3,若依框架中整合的springBoot版本为2.5.14。Nacos核心提供两个功能:服务注册与发现,动态配置管理。 一、服…...
JAVA面试八股文一(mysql)
B-Tree和BTree区别共同点;一个节点可以有多个元素, 排好序的不同点:BTree叶子节点之间有指针,非叶子节点之间的数据都冗余了一份在叶子节点BTree是B-Tree 的升级mysql什么情况设置了索引,但无法使用a.没符合最左原则b.…...
动静态库概念及创建
注意在库中不能写main()函数。 复习gcc指令 预处理-E-> xx.i 编译 -S-> xx.s 汇编 -c-> xx.o 汇编得到的 xx.o称为目标可重定向二进制文件,此时的文件需要把第三方库链接进来才变成可执行程序。 gcc -o mymath main.c myadd.c mysub.c得到的mymath可以执…...
制作网站付费软件/国内seo做最好的公司
1、STL中的容器 STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stack), 主要是分为 我们常用到的STL容器有vector、list、deque、…...
做网站的公司怎么拓展业务/win10优化大师好用吗
数据泵expdp/impdp工具的使用: 建立数据泵目录 使用数据泵需要先建directory create directory dump_scott as/home/oracle/dump/scott 查看建立的目录 Select * from dba_directories 赋权 Grant read,write on directory dump_scott toscott 导出案例1&…...
生日快乐软件制作app/上海百度提升优化
今天在转换一个文件时iconv() 老是返回 -1, 提示编码转换失败。 一共 30 多个文件, 原编码都是一样的,为什么有的转换会失败,返回 -1呢? 网上搜索了一下, 找到一个随加参数: //IGNORE 说是 iconv_open() 的…...
网站改版对seo影响/品牌传播策略
[url]http://my.oschina.net/u/2416019/blog/633804[/url] 使用WebServlet就不需要web.xml配置了。当标注与web.xml同时配置时,标注无效。 使用配置描述符(命名:web.xml)的好处是:如果需要修改配置值,如&am…...
杭州营销网站建设公司/怎样优化标题关键词
视图模板 index.blade.php {!! Form::open([url>/articles]) !!} //指定文章上传路由 <div class"form-group"> //添加样式{!! Form::label(title)!!}{!! Form::text(title,null,[class>form-control,‘id>3])!!} //添加样式,也可传参。…...
电子科技学校网站建设/上海网站seo策划
我非常喜欢使用甘特图来做项目管理。不用甘特图的公司,我觉得很奇怪。 什么是甘特图 什么是甘特图呢?下面这张图就是甘特图。 这张图是我12月离职做交接时候的甘特图。 不同的颜色表示不同的人每一行表示一个任务红色竖线表示今天应该完成的任务任务与任…...