Python 临时文件怎么创建并自动清理
来源:17golang原创
时间:2026-09-06 10:30:41 345浏览 收藏
处理上传文件、压缩中间结果或导出预览时,临时文件最好交给 tempfile 管理。只在当前代码块内使用内容,就选 TemporaryFile;需要把路径交给另一个程序,就选 NamedTemporaryFile;一次任务产生一组文件,则用 TemporaryDirectory。它们都能和 with 一起使用,异常退出也会走清理逻辑。
- 临时文件不需要路径时,
TemporaryFile是最省心的默认选择。 - 需要可见文件名时使用
NamedTemporaryFile,Windows 下重开文件要特别处理delete_on_close。 - 多个中间产物放进
TemporaryDirectory,离开上下文后目录和内容一起回收。 mkstemp()与mkdtemp()是底层接口,必须自己关闭句柄并删除路径。
先按“是否需要路径”选择临时文件接口
这个选择比记住一堆参数更重要。TemporaryFile 返回类文件对象,适合写入后立即读取;NamedTemporaryFile 保证有可见的 name;TemporaryDirectory 管理的是目录树。下面这张关系图把数据生命周期和清理责任放在一起看。

| 需求 | 接口 | 清理方式 |
|---|---|---|
| 当前函数内读写 | TemporaryFile | 关闭或离开 with 自动删除 |
| 把路径交给外部工具 | NamedTemporaryFile | 由 delete、delete_on_close 决定 |
| 多个中间文件 | TemporaryDirectory | 上下文结束时删除目录树 |
只在当前流程读写时用 TemporaryFile
例如把一段 JSON 先写入临时对象,再交给解析器读取。默认模式是二进制,文本场景可以明确传入 mode="w+" 和 encoding。游标写完要回到开头,否则读到的会是空内容。
import json
import tempfile
def load_preview(payload: dict) -> dict:
# with 结束时关闭并清理临时文件
with tempfile.TemporaryFile(mode="w+", encoding="utf-8") as temp:
json.dump(payload, temp, ensure_ascii=False)
# 写入后把游标移回文件开头
temp.seek(0)
return json.load(temp)
这里不需要知道真实路径,也不需要在 finally 中手动删除。函数返回前离开 with,文件对象会关闭,临时内容随之回收。若逻辑必须让另一个进程按路径打开,就不要硬套这个接口。
需要文件名时处理 NamedTemporaryFile 的关闭边界
文件上传或调用外部命令时,常常需要把路径放进参数。此时可以先创建命名临时文件,再关闭它,让外部程序重新打开。Python 文档特别建议在上下文中使用 delete_on_close=False:关闭文件后仍保留路径,退出 with 时再自动清理。
from pathlib import Path
import tempfile
def handoff_to_tool(data: bytes) -> str:
# 退出 with 后仍会删除文件,避免遗留中间产物
with tempfile.NamedTemporaryFile(
mode="wb", suffix=".bin", delete_on_close=False
) as temp:
temp.write(data)
temp.flush()
path = Path(temp.name)
# 外部工具应在这里按 path 读取,且先确保句柄已关闭
temp.close()
consume_path(path)
return str(path)
def consume_path(path: Path) -> None:
# 示例边界:真实项目可在此调用受控的外部工具
if not path.is_file():
raise FileNotFoundError(path)

在 POSIX 系统中,打开中的命名临时文件通常可以再次打开;Windows 对删除共享更严格。为了跨平台,外部程序读取前先关闭临时文件通常更稳。若把 delete=False,清理责任就转移给你的代码,不能因为测试通过就把删除遗漏到生产环境。
多个中间产物用 TemporaryDirectory 集中清理
压缩、转换或批量导出往往不止一个文件。用独立目录包住这一组中间结果,成功、异常和提前返回都会经过同一个生命周期出口:
from pathlib import Path
import tempfile
def build_bundle(source: bytes) -> bytes:
with tempfile.TemporaryDirectory(prefix="bundle-") as temp_dir:
root = Path(temp_dir)
raw = root / "source.bin"
result = root / "result.bin"
# 中间文件都限制在本次任务的临时目录中
raw.write_bytes(source)
transform(raw, result)
return result.read_bytes()
def transform(source: Path, target: Path) -> None:
# 示例转换:真实项目在这里写入转换后的结果
target.write_bytes(source.read_bytes())
不要在 with 外继续使用 root 下的路径:目录已经被清理。确实需要保留结果时,应在退出前复制到明确的持久目录,并把“临时”和“最终产物”区分开。
底层 mkstemp 什么时候需要自己清理
mkstemp() 返回文件描述符和绝对路径,适合需要操作系统级句柄的场景,但它不会替你关闭和删除。手动代码至少要同时覆盖句柄释放与路径删除,且删除动作放在 finally:
import os
import tempfile
def write_low_level(data: bytes) -> str:
fd, path = tempfile.mkstemp(suffix=".bin")
try:
# fd 是已打开的底层句柄,写完要显式关闭
with os.fdopen(fd, "wb") as temp:
temp.write(data)
return path
finally:
# 无论写入或后续处理是否抛错,都清理临时路径
if os.path.exists(path):
os.remove(path)
上例只演示责任边界:如果返回路径给调用方继续使用,就不能在函数的 finally 中删除,而要把删除责任交给更外层的拥有者。不要使用已经弃用的 mktemp(),它先返回名字、后创建文件,中间存在竞态窗口。
常见问题
临时文件默认会放在哪里?
由 TMPDIR、TEMP、TMP 等环境变量和平台默认目录共同决定。需要固定位置时给接口传 dir,不要修改模块级的 tempdir。
为什么写完临时文件后读取不到内容?
文件游标仍停在末尾。写入后调用 seek(0),或者关闭文件后再按路径读取。
delete 和 delete_on_close 有什么区别?
delete 决定是否启用自动删除;delete_on_close 决定删除更偏向关闭时发生,还是延迟到上下文退出。需要关闭后重开时,优先在 with 中使用 delete_on_close=False。
把临时文件当成有明确拥有者的资源:创建者决定接口,使用者决定关闭边界,生命周期结束处负责清理。这样即使处理逻辑抛出异常,也不会把“临时”变成服务器上的长期垃圾。
-
346 收藏
-
235 收藏
-
225 收藏
-
389 收藏
-
250 收藏
-
459 收藏
-
325 收藏
-
301 收藏
-
316 收藏
-
278 收藏
-
261 收藏
-
144 收藏
-
443 收藏
-
126 收藏
-
文章 · python教程 | 13小时前 | 文件处理 · csv · Python教程 · 排错 · csv.Writer Python写CSV 多余空行 newline lineterminator361 收藏
-
335 收藏
-
339 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习