tempfile模块:临时文件与临时目录的高级用法
请介绍Python tempfile模块的常用函数:TemporaryFile、NamedTemporaryFile、mkstemp、mkdtemp、TemporaryDirectory。对比它们的用途、生命周期管理(自动删除)、安全性、以及对二进制/文本模式的支持。
回答
我是大山
TemporaryFile — 无名称临时文件
from tempfile import TemporaryFile
with TemporaryFile(mode='w+b') as f:
f.write(b'Hello World')
f.seek(0)
print(f.read()) # b'Hello World'
# 文件随上下文退出自动删除
- 文件系统上无文件名(某些Unix上可能没有名称)
- 其他进程无法访问
- 默认使用
w+b二进制模式
NamedTemporaryFile — 有名称的临时文件
from tempfile import NamedTemporaryFile
with NamedTemporaryFile(mode='w', suffix='.txt', prefix='tmp_', delete=True) as f:
print(f.name) # '/tmp/tmp_abcdef.txt'
f.write('Hello')
# 退出后自动删除(delete=True默认)
- 有文件路径,可传递给其他函数或进程
- 可选参数:
suffix后缀、prefix前缀、dir目录 delete=False:不自动删除,需手动清理
mkstemp — 低级接口(返回文件描述符)
import os
from tempfile import mkstemp
fd, path = mkstemp(suffix='.tmp', prefix='myapp_')
try:
with os.fdopen(fd, 'w') as f:
f.write('data')
# 使用path
finally:
os.unlink(path) # 手动删除
- 返回
(fd, path),fd是文件描述符(整数) - 不会自动管理,需手动关闭和删除
TemporaryDirectory — 自动清理的临时目录(推荐)
from tempfile import TemporaryDirectory
with TemporaryDirectory(prefix='myapp_') as tmpdir:
print(tmpdir) # '/tmp/myapp_xxxxx'
# 在目录中工作
# 自动删除整个目录
安全考虑
tempfile模块创建的文件默认权限为0o600(仅所有者可读写)- 随机文件名,避免竞态条件攻击
最佳实践: 优先使用TemporaryFile或NamedTemporaryFile(自动清理),需要目录时用TemporaryDirectory。