python3从入门到精通(十三): tempfile模块
tempfile模块详解
- 一、基本概念
- 二、常用函数
- 函数常用参数:
- 2.1、TemporaryFile()函数
- 2.2、NamedTemporaryFile()函数
- 2.3、TemporaryDirectory()函数
- 2.4、SpooledTemporaryFile()函数
- 三、低级API
- 3.1、mkstemp()函数
- 3.2、mkdtemp()函数
- 四、全局配置
- 五、案例
- 5.1、生成临时文件供其他程序使用
一、基本概念
tempfile 是Python内置的临时文件/目录处理模块,用来创建用完即删、自动清理、不会冲突的临时文件和文件夹。
核心优势:
1、自动生成唯一文件名,不会覆盖已有文件
2、支持自动删除(关闭即删)
3、无需手动管理文件删除
二、常用函数
| 函数 / 类 | 用途 | 是否自动删除 |
|---|---|---|
| TemporaryFile() | 临时文件(无名字) | 关闭自动删除 |
| NamedTemporaryFile() | 带名字的临时文件 | 关闭自动删除 |
| SpooledTemporaryFile() | 内存临时文件(高效) | 关闭自动删除 |
| TemporaryDirectory() | 临时文件夹 | 退出自动删除 |
| mkstemp() | 低级创建临时文件 | 不自动删 |
| mkdtemp() | 低级创建临时目录 | 不自动删 |
函数常用参数:
- mode=‘w+b’:指定文件的打开模式,默认是 ‘w+b’
- delete=True:关闭后自动删除(默认)
- prefix=‘tmp_’:指定临时文件或目录名的前缀
- suffix=‘.txt’:指定临时文件或目录名的后缀
- dir=‘./’:指定临时文件或目录的存储路径。如果不指定,则使用系统的临时文件目录(通过 tempfile.gettempdir() 获取)
2.1、TemporaryFile()函数
创建无名字临时文件,关闭自动删除,无法被其他进程访问
1、完全匿名,其他程序无法访问
2、只支持二进制模式(默认)
3、文件对象被关闭,文件就会立即被销毁
importtempfile# 默认模式为 'w+b',创建临时文件(二进制模式)withtempfile.TemporaryFile()asf:f.write(b"Hello Temp File!")# 写入数据f.seek(0)# 回到文件开头print(f.read())# 退出with后,文件自动被删除2.2、NamedTemporaryFile()函数
创建带名字的临时文件,可通过 name 属性获取路径,关闭自动删除
withtempfile.NamedTemporaryFile(mode='w+t',encoding='utf-8')asf:print("临时文件路径: ",f.name)# 可以拿到文件名f.write("临时文件内容")f.seek(0)print(f.read())# 退出with后,文件自动被删除# 创建带后缀和前缀,并且指定路径,最后不删除的临时文件withtempfile.NamedTemporaryFile(suffix='.log',prefix='app_',delete=False,dir="./")asf:print(f.name)# 类似 /tmp/app_xxx.log# 手动删除文件os.remove(f.name)print('临时文件已手动删除')2.3、TemporaryDirectory()函数
创建临时文件夹,退出时整个目录会递归的自动删除
importtempfileimportoswithtempfile.TemporaryDirectory()astmpdir:print(f'临时目录已创建:{temp_dir}')# 在临时目录里创建文件file_path=os.path.join(tmpdir,"test.txt")withopen(file_path,'w')asf:f.write("hello")# 退出with后,整个目录及创建的文件均被自动删除2.4、SpooledTemporaryFile()函数
内存级临时文件,数据首先会保存在内存中,直到达到指定阈值 (max_size),才会被真正写入磁盘上的临时文件,性能高。
# max_size=1024 表示数据超出 1KB 后才会写入磁盘withtempfile.SpooledTemporaryFile(max_size=1024,mode='w+t')asspooled:spooled.write('A'*100)# 写入 100 字节,仍在内存中print(spooled._rolled)# 输出 False,表示数据仍在内存spooled.write('B'*1024)# 写入 1024 字节,此时总大小 1124 > 1024print(spooled._rolled)# 输出 True,表示数据已转储到磁盘三、低级API
3.1、mkstemp()函数
创建临时文件,不会自动删除,返回文件描述符 + 路径
fd,path=tempfile.mkstemp(suffix='.log',prefix='app_',dir='./')print("临时文件路径: ",path)# 手动关闭、手动删除os.close(fd)os.unlink(path)3.2、mkdtemp()函数
创建临时目录,不会自动删除
tmp_dir=tempfile.mkdtemp()print(tmp_dir)# 用完手动删importshutil shutil.rmtree(tmp_dir)四、全局配置
# 设置全局临时文件目录tempfile.tempdir="./my_temp"# 设置全局前缀tempfile.template="myapp_temp_%s"# 之后创建的所有临时文件都会用这个配置withtempfile.NamedTemporaryFile()asf:print(f.name)# 获取系统默认临时文件夹路径print(tempfile.gettempdir())# 获取临时文件名模板print(tempfile.gettempprefix())五、案例
5.1、生成临时文件供其他程序使用
importtempfileimportsubprocessimportos# 创建一个带名字的临时脚本文件withtempfile.NamedTemporaryFile(mode='w',suffix='.sh',delete=False)asf:f.write("#!/bin/bash\necho 'hello from temp script'")f.flush()# 让其他程序使用这个临时文件result=subprocess.run(['bash',f.name],capture_output=True,text=True)print(result.stdout)# 手动删除(因为 delete=False)os.unlink(f.name)print("临时文件已清理")