tempfile模块详解
一、基本概念
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、文件对象被关闭,文件就会立即被销毁
import tempfile
# 默认模式为 'w+b',创建临时文件(二进制模式)
with tempfile.TemporaryFile() as f:
f.write(b"Hello Temp File!") # 写入数据
f.seek(0) # 回到文件开头
print(f.read())
# 退出with后,文件自动被删除
2.2、NamedTemporaryFile()函数
创建带名字的临时文件,可通过 name 属性获取路径,关闭自动删除
with tempfile.NamedTemporaryFile(mode='w+t', encoding='utf-8') as f:
print("临时文件路径: ", f.name) # 可以拿到文件名
f.write("临时文件内容")
f.seek(0)
print(f.read())
# 退出with后,文件自动被删除
# 创建带后缀和前缀,并且指定路径,最后不删除的临时文件
with tempfile.NamedTemporaryFile(suffix='.log', prefix='app_', delete=False, dir="./") as f:
print(f.name) # 类似 /tmp/app_xxx.log
# 手动删除文件
os.remove(f.name)
print('临时文件已手动删除')
2.3、TemporaryDirectory()函数
创建临时文件夹,退出时整个目录会递归的自动删除
import tempfile
import os
with tempfile.TemporaryDirectory() as tmpdir:
print(f'临时目录已创建: {temp_dir}')
# 在临时目录里创建文件
file_path = os.path.join(tmpdir, "test.txt")
with open(file_path, 'w') as f:
f.write("hello")
# 退出with后,整个目录及创建的文件均被自动删除
2.4、SpooledTemporaryFile()函数
内存级临时文件,数据首先会保存在内存中,直到达到指定阈值 (max_size),才会被真正写入磁盘上的临时文件,性能高。
# max_size=1024 表示数据超出 1KB 后才会写入磁盘
with tempfile.SpooledTemporaryFile(max_size=1024, mode='w+t') as spooled:
spooled.write('A' * 100) # 写入 100 字节,仍在内存中
print(spooled._rolled) # 输出 False,表示数据仍在内存
spooled.write('B' * 1024) # 写入 1024 字节,此时总大小 1124 > 1024
print(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)
# 用完手动删
import shutil
shutil.rmtree(tmp_dir)
四、全局配置
# 设置全局临时文件目录
tempfile.tempdir = "./my_temp"
# 设置全局前缀
tempfile.template = "myapp_temp_%s"
# 之后创建的所有临时文件都会用这个配置
with tempfile.NamedTemporaryFile() as f:
print(f.name)
# 获取系统默认临时文件夹路径
print(tempfile.gettempdir())
# 获取临时文件名模板
print(tempfile.gettempprefix())
五、案例
5.1、生成临时文件供其他程序使用
import tempfile
import subprocess
import os
# 创建一个带名字的临时脚本文件
with tempfile.NamedTemporaryFile(mode='w', suffix='.sh', delete=False) as f:
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("临时文件已清理")

6566

被折叠的 条评论
为什么被折叠?



