在Python开发中,临时文件常用于存储中间计算结果、临时缓存数据等场景,但是如果忘记手动删除这些文件,就会留下无用的文件占用磁盘空间。借助tempfile模块和with语句的特性,可以实现临时文件在with代码块结束后自动删除,无需额外的清理操作。

使用TemporaryFile创建匿名临时文件
TemporaryFile是tempfile模块中最基础的临时文件类,创建的文件不会在文件系统中留下名称,适合不需要通过文件名访问的场景,退出with块后会自动删除。
import tempfile
# 创建临时文件,使用with语句管理生命周期
with tempfile.TemporaryFile(mode='w+t', encoding='utf-8') as tmp_file:
# 向临时文件写入内容
tmp_file.write('这是临时文件的内容')
# 将文件指针移到开头,方便读取
tmp_file.seek(0)
# 读取文件内容
content = tmp_file.read()
print(f'读取到的内容:{content}')
# with块结束后,临时文件会自动删除,无需手动调用close或unlink
使用NamedTemporaryFile创建有名称的临时文件
如果需要获取临时文件的路径,让其他进程也能访问这个临时文件,可以使用NamedTemporaryFile,默认情况下delete参数设为True,退出with块后自动删除文件。
import tempfile
import os
with tempfile.NamedTemporaryFile(mode='w+t', delete=True, suffix='.txt', prefix='tmp_', encoding='utf-8') as named_tmp:
# 获取临时文件的路径
tmp_path = named_tmp.name
print(f'临时文件路径:{tmp_path}')
# 写入内容
named_tmp.write('带名称的临时文件内容')
named_tmp.seek(0)
# 可以在with块内通过路径访问文件
with open(tmp_path, 'r', encoding='utf-8') as f:
print(f'通过路径读取内容:{f.read()}')
# with块结束后,临时文件自动删除
print(f'文件是否存在:{os.path.exists(tmp_path)}') # 输出False
使用mkstemp创建临时文件并手动控制删除
如果需要在更灵活的场景下管理临时文件,也可以使用mkstemp函数,它会返回文件描述符和文件路径,需要手动在with块结束后删除,但可以结合try-finally结构保证删除逻辑执行。
import tempfile
import os
file_descriptor, tmp_path = tempfile.mkstemp(suffix='.log', prefix='test_')
try:
with os.fdopen(file_descriptor, 'w+t', encoding='utf-8') as tmp_file:
tmp_file.write('mkstemp创建的临时文件')
tmp_file.seek(0)
print(f'内容:{tmp_file.read()}')
finally:
# 无论是否出现异常,都删除临时文件
if os.path.exists(tmp_path):
os.unlink(tmp_path)
print(f'删除后文件是否存在:{os.path.exists(tmp_path)}')
不同方案的选择建议
- 如果不需要通过文件名访问临时文件,优先选择
TemporaryFile,开销最小且不会留下文件痕迹。 - 如果需要获取临时文件路径,供其他代码或进程访问,选择
NamedTemporaryFile,注意delete参数默认是True,不需要额外设置。 - 如果需要更底层的文件描述符控制,或者需要自定义更多的临时文件属性,可以使用
mkstemp配合手动删除逻辑。
所有方案都建议结合with语句使用,利用上下文管理器的特性,最大程度避免忘记删除临时文件导致的资源泄漏问题。