
Python tempfile 深入实战:安全、优雅地处理临时文件与临时目录
在日常 Python 开发里,很多人都会写出这样的代码:
python
with open("/tmp/data.txt", "w") as f:
f.write("hello")
看起来没什么问题,甚至还挺顺手。
但只要程序稍微复杂一点,这种"手搓临时文件"的方式很快就会暴露出一堆隐患:文件名冲突、权限问题、清理不彻底、跨平台行为不一致、并发下踩坑......
这时候,tempfile 就不是"可有可无的小工具",而是一个非常值得认真掌握的标准库模块。
这篇文章不打算停留在"会用"层面,而是带你把 tempfile 真正吃透:
从核心 API、底层行为、跨平台差异,到生产环境里的常见误区与最佳实践,一次讲明白。
一、为什么你真的需要 tempfile
临时文件的典型使用场景非常多:
- 处理上传文件后,先落盘再解析
- 下载远程内容,做中间缓存
- 大文件处理中,避免一次性全部驻留内存
- 调用第三方命令行工具时,生成中间输入/输出文件
- 测试代码时,隔离运行环境
- 数据转换、压缩、解压、音视频处理时保存中间结果
很多人第一次写临时文件,都是直接拼路径:
python
import os
import time
filename = f"/tmp/{int(time.time())}.txt"
with open(filename, "w") as f:
f.write("temporary data")
这种写法的问题非常明显:
1. 文件名可能冲突
如果多个进程或线程同时运行,时间戳甚至 UUID 的方案也未必绝对安全。
2. 容易留下垃圾文件
程序异常退出、逻辑分支遗漏,都可能导致临时文件没被清理。
3. 有安全风险
如果文件名可预测,恶意用户可能利用符号链接、抢占文件名等方式制造安全问题。
4. 跨平台行为复杂
Linux 上能工作的代码,到了 Windows 可能因为文件占用机制直接翻车。
而 tempfile 的价值就在这里:
✅ 自动生成安全的临时文件名
✅ 尽量减少竞争条件
✅ 提供自动清理机制
✅ 官方标准库,跨平台兼容性更可靠
一句话总结:
凡是"只打算短暂存在"的文件或目录,都应该优先考虑
tempfile。
二、tempfile 到底是什么
tempfile 是 Python 标准库中专门用来创建临时文件和临时目录的模块。
它主要提供两类能力:
| 类别 | 典型 API | 用途 |
|---|---|---|
| 高层接口 | TemporaryFile()、NamedTemporaryFile()、TemporaryDirectory()、SpooledTemporaryFile() |
绝大多数业务开发直接用 |
| 低层接口 | mkstemp()、mkdtemp() |
需要更细粒度控制时使用 |
如果你刚接触这个模块,可以先记住下面这张"路线图":
- 只想要一个临时文件对象:
TemporaryFile - 想要"有文件名"的临时文件:
NamedTemporaryFile - 想要临时目录:
TemporaryDirectory - 小数据放内存、大数据自动落盘:
SpooledTemporaryFile - 想自己控制文件描述符、权限、清理逻辑:
mkstemp/mkdtemp
三、最常用的 4 个核心 API
1. tempfile.TemporaryFile()
这是最基础的临时文件接口。
python
import tempfile
with tempfile.TemporaryFile(mode="w+t", encoding="utf-8") as f:
f.write("hello tempfile")
f.seek(0)
print(f.read())
输出:
python
hello tempfile
它的特点
- 返回的是一个文件对象
- 文件通常没有稳定可见的文件名
- 关闭后自动删除
- 很适合"只在当前进程内部使用"的场景
参数里最重要的几个
python
tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None)
常用关注点:
mode:文件打开模式,默认是二进制读写w+bencoding:文本模式时指定编码suffix:文件后缀,比如.txtprefix:文件名前缀dir:指定临时文件创建目录
一个常见细节:默认是二进制模式
很多人第一次写会这样:
python
with tempfile.TemporaryFile() as f:
f.write("abc")
这会报错,因为默认是二进制模式,写字符串不行。
正确写法要么写字节:
python
with tempfile.TemporaryFile() as f:
f.write(b"abc")
要么切成文本模式:
python
with tempfile.TemporaryFile(mode="w+", encoding="utf-8") as f:
f.write("abc")
适合什么场景
📌 临时缓存
📌 中间计算结果
📌 不需要暴露路径给外部程序
📌 希望作用域结束自动清理
2. tempfile.NamedTemporaryFile()
如果说 TemporaryFile() 是"匿名临时文件",那 NamedTemporaryFile() 就是"带名字的临时文件"。
python
import tempfile
with tempfile.NamedTemporaryFile(mode="w+", encoding="utf-8") as f:
print("文件路径:", f.name)
f.write("hello")
f.seek(0)
print(f.read())
最大区别:它有 name
这意味着你可以把这个文件路径传给别的函数、库、甚至外部命令行程序。
例如:
python
import tempfile
import pathlib
with tempfile.NamedTemporaryFile(mode="w+", suffix=".txt", encoding="utf-8") as f:
path = pathlib.Path(f.name)
f.write("temporary content")
f.flush()
print(path.read_text(encoding="utf-8"))
为什么要 flush()
这是非常实战的一个点。
写入文件后,数据可能还在缓冲区里,没有立即刷到磁盘。
如果你要让别的代码通过路径去读这个文件,通常要先:
python
f.flush()
有时还会进一步加上:
python
import os
os.fsync(f.fileno())
尤其在你要调用外部程序、或者对"立刻落盘"要求很高的场景里,这一点很重要。
NamedTemporaryFile() 最容易踩的坑:Windows
很多文章讲到这里一笔带过,但实际上这是最常见的线上/本地开发问题之一。
看下面这段代码:
python
import tempfile
with tempfile.NamedTemporaryFile(mode="w+", encoding="utf-8") as f:
print(f.name)
with open(f.name, "r", encoding="utf-8") as another:
print(another.read())
这段代码在 Linux/macOS 上大概率没问题,
但在 Windows 上,很可能直接失败,因为文件仍被当前进程以特定方式占用,导致不能再次打开。
怎么解决
最常见方案是这样:
python
import tempfile
with tempfile.NamedTemporaryFile(
mode="w",
encoding="utf-8",
delete=False
) as f:
temp_name = f.name
f.write("hello from tempfile")
try:
with open(temp_name, "r", encoding="utf-8") as reader:
print(reader.read())
finally:
import os
os.unlink(temp_name)
这段代码的核心思路
- 创建一个"有名字"的临时文件
- 设置
delete=False,避免文件一关闭就被删除 - 关闭文件后,再以普通方式重新打开
- 最后手动删除
这是一种非常经典、非常可靠的跨平台写法。
delete=False 什么时候用
适合这些情况:
- 你需要把路径传给其他进程
- 你需要关闭当前文件后再重新打开
- 你在 Windows 上做兼容
- 你要保留临时文件方便排查问题
但请记住:
只要你用了
delete=False,清理责任就从tempfile转移到了你自己身上。
3. tempfile.TemporaryDirectory()
处理临时文件时,很多人会忘了:
真正复杂的业务里,往往不是一个临时文件,而是一整个临时工作目录。
比如:
- 解压 ZIP 到某个目录
- 批量生成多个中间文件
- 克隆仓库到临时目录里分析
- 图像处理流水线输出多张中间图
- 单元测试中构造一套临时目录结构
这时候,TemporaryDirectory() 就特别顺手。
python
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as temp_dir:
temp_path = Path(temp_dir)
file1 = temp_path / "a.txt"
file2 = temp_path / "b.txt"
file1.write_text("A", encoding="utf-8")
file2.write_text("B", encoding="utf-8")
print(list(temp_path.iterdir()))
退出 with 后,整个目录会被自动删除。
这个 API 的优势非常明显
✅ 适合组织多个中间文件
✅ 清理的是整个目录,不用一个个删
✅ 和 pathlib.Path 配合非常舒服
实战建议
如果你的逻辑中会创建多个临时文件,优先用临时目录来包裹,而不是散落一堆临时文件。
原因很简单:
- 结构更清晰
- 清理更彻底
- 调试时更方便
- 出错时更容易整体保留现场
例如:
python
import tempfile
from pathlib import Path
def process_files():
with tempfile.TemporaryDirectory(prefix="myjob_") as temp_dir:
temp_dir = Path(temp_dir)
raw_file = temp_dir / "raw.json"
cleaned_file = temp_dir / "cleaned.json"
result_file = temp_dir / "result.txt"
raw_file.write_text('{"name": "python"}', encoding="utf-8")
cleaned_file.write_text('{"name":"python"}', encoding="utf-8")
result_file.write_text("done", encoding="utf-8")
return result_file.read_text(encoding="utf-8")
4. tempfile.SpooledTemporaryFile()
这个类很有意思,也很实用,但很多人完全没用过。
它的设计思想是:
数据量小时放在内存里,超过阈值后再自动写入磁盘。
python
import tempfile
with tempfile.SpooledTemporaryFile(max_size=1024, mode="w+t", encoding="utf-8") as f:
f.write("small content")
f.seek(0)
print(f.read())
它有什么价值
这类对象非常适合处理"大小不确定"的数据流:
- 小文件直接在内存中处理,速度快
- 大文件自动溢出到磁盘,避免内存爆掉
典型使用场景
- Web 上传文件缓冲
- 导出报表时先写入缓存
- 中间数据量不确定的场景
- 想兼顾性能和内存安全
重点参数:max_size
python
tempfile.SpooledTemporaryFile(max_size=1024 * 1024)
意思是:
在数据量不超过 1MB 时,先不落盘;
超过后,自动切换到底层真实临时文件。
手动触发落盘:rollover()
有时候你希望即使还没达到阈值,也立刻切换到磁盘文件:
python
import tempfile
with tempfile.SpooledTemporaryFile(max_size=1024, mode="w+t", encoding="utf-8") as f:
f.write("hello")
f.rollover() # 强制从内存切换到底层文件
这在调试或者与某些需要真实文件对象的库对接时很有帮助。
四、底层接口:mkstemp() 和 mkdtemp()
如果你需要更底层的控制,可以用这两个函数。
1. tempfile.mkstemp()
python
import os
import tempfile
fd, path = tempfile.mkstemp(suffix=".log")
try:
with os.fdopen(fd, "w", encoding="utf-8") as f:
f.write("log content")
print(path)
finally:
os.unlink(path)
返回值是什么
fd:底层文件描述符path:文件路径
为什么说它更底层
因为它只是帮你安全地创建文件,
但不会像高层接口那样帮你包装好上下文管理和自动删除逻辑。
你需要自己做这些事。
它适合什么场景
- 你需要文件描述符级别的控制
- 你想精确管理打开方式
- 你要和较底层系统调用打交道
- 你不想依赖高级文件对象行为
2. tempfile.mkdtemp()
python
import shutil
import tempfile
from pathlib import Path
temp_dir = tempfile.mkdtemp(prefix="demo_")
try:
path = Path(temp_dir)
(path / "example.txt").write_text("hello", encoding="utf-8")
print(path)
finally:
shutil.rmtree(temp_dir)
注意点
mkdtemp() 创建目录后,不会自动清理 。
你必须自己负责删除。
五、tempfile 的常用参数详解
很多人平时只会写:
python
tempfile.NamedTemporaryFile()
但实际工作里,下面这些参数非常有用。
1. suffix
指定后缀名。
python
tempfile.NamedTemporaryFile(suffix=".csv")
这在很多第三方工具里非常重要。
因为有些程序会根据后缀判断文件类型。
例如:
.json.csv.png.mp4
⚠️ 不要小看这个参数,很多"为什么工具读不出来"的问题,最后都卡在后缀名上。
2. prefix
指定前缀名。
python
tempfile.NamedTemporaryFile(prefix="report_")
这在调试时很有帮助,你更容易从一堆临时文件里识别哪个是自己生成的。
3. dir
指定临时目录位置。
python
tempfile.NamedTemporaryFile(dir="/custom/tmp")
使用场景包括:
- 默认临时目录空间不足
- 想把临时文件放到 SSD 提升性能
- 容器环境里指定挂载目录
- 合规要求:中间文件必须落在特定路径
4. mode
决定是文本还是二进制。
| 模式 | 含义 |
|---|---|
w+b |
二进制读写,默认 |
w+ |
文本读写 |
wb |
二进制只写 |
w |
文本只写 |
经验建议
- 图片、压缩包、Excel、PDF、音视频:用二进制模式
- JSON、TXT、CSV(简单文本写入):用文本模式
- 不确定时,优先确认你写入的是
str还是bytes
六、临时文件到底创建在哪里
很多人会有个疑问:
tempfile到底把文件放哪儿了?
你可以这样查看:
python
import tempfile
print(tempfile.gettempdir())
在不同系统上,常见结果如下:
| 系统 | 可能的默认临时目录 |
|---|---|
| Linux | /tmp |
| macOS | /var/folders/... |
| Windows | C:\\Users\\用户名\\AppData\\Local\\Temp |
也可以查看候选目录
python
import tempfile
print(tempfile.gettempprefix())
另外,tempfile 会参考一些环境变量,比如:
TMPDIRTEMPTMP
这意味着在容器、CI、云函数或某些部署环境里,临时目录位置可能和平时本地开发不一样。
生产环境建议
🔍 不要假设临时目录一定是 /tmp
🔍 不要假设临时目录空间一定够大
🔍 涉及大文件时,最好显式指定 dir
七、实战场景一:处理上传文件
假设你在写一个 Web 服务,用户会上传一个 CSV 文件,你需要先落盘,再交给 Pandas 处理。
python
import tempfile
import pandas as pd
def handle_uploaded_file(file_obj):
with tempfile.NamedTemporaryFile(suffix=".csv", delete=False) as temp_file:
temp_file.write(file_obj.read())
temp_path = temp_file.name
try:
df = pd.read_csv(temp_path)
return df.head().to_dict()
finally:
import os
os.unlink(temp_path)
为什么这里不用 TemporaryFile()
因为很多库更适合直接接受路径 而不是一个已经打开的文件对象。
而 NamedTemporaryFile() 正好能提供路径。
为什么 delete=False
因为在某些平台上,如果文件一直处于打开状态,再交给别的库去打开可能出问题。
先关闭,再读,是更稳妥的方式。
八、实战场景二:调用外部命令
这是 tempfile 非常典型的使用方式。
比如你要调用 ffmpeg、wkhtmltopdf、libreoffice、pandoc 这类外部工具。
python
import os
import subprocess
import tempfile
with tempfile.NamedTemporaryFile(suffix=".txt", mode="w", encoding="utf-8", delete=False) as input_file:
input_file.write("Hello subprocess")
input_path = input_file.name
try:
result = subprocess.run(
["cat", input_path],
capture_output=True,
text=True,
check=True
)
print(result.stdout)
finally:
os.unlink(input_path)
经验结论
与外部程序交互时:
- 优先用
NamedTemporaryFile - 经常需要
delete=False - 写完后确保
flush()或关闭文件 - 最后务必清理
这类代码在 Linux 上也许"随便写都能跑",
但想要真正跨平台、可维护,还是得按规矩来。
九、实战场景三:单元测试隔离环境
测试代码时,最烦的事情之一就是"跑完留下脏文件"。
这时候 TemporaryDirectory() 非常适合。
python
import tempfile
from pathlib import Path
def generate_report(output_dir):
output_path = Path(output_dir) / "report.txt"
output_path.write_text("report content", encoding="utf-8")
return output_path
def test_generate_report():
with tempfile.TemporaryDirectory() as temp_dir:
report_path = generate_report(temp_dir)
assert report_path.exists()
assert report_path.read_text(encoding="utf-8") == "report content"
这样写的好处
✅ 测试之间互不干扰
✅ 不污染项目目录
✅ 失败后容易定位问题
✅ 非常适合 pytest / unittest
十、实战场景四:大文件缓存与内存控制
如果你处理的数据大小不固定,SpooledTemporaryFile() 很值得考虑。
python
import tempfile
def process_stream(chunks):
with tempfile.SpooledTemporaryFile(max_size=1024 * 1024, mode="w+b") as f:
for chunk in chunks:
f.write(chunk)
f.seek(0)
return f.read(100)
这个设计的妙处在于:
- 小数据走内存,快
- 大数据自动切盘,稳
对于上传、导出、数据转换这类业务,这个思路非常实用。
十一、最容易踩的 8 个坑
下面这些问题,几乎都是实际开发里高频出现的。
坑 1:忘了默认是二进制模式
python
with tempfile.TemporaryFile() as f:
f.write("hello") # 报错
正确做法:
python
with tempfile.TemporaryFile(mode="w+", encoding="utf-8") as f:
f.write("hello")
坑 2:写完就让别的程序读,但没 flush
python
with tempfile.NamedTemporaryFile(mode="w+", encoding="utf-8") as f:
f.write("data")
# 这里立刻把路径交给别的逻辑,可能读不到完整内容
正确姿势:
python
f.flush()
必要时加:
python
import os
os.fsync(f.fileno())
坑 3:用了 delete=False 却忘记删除
这个问题在开发环境可能只是"目录脏了",
在生产环境里可能就是磁盘一点点被吃满。
建议把清理写进 finally:
python
path = None
try:
with tempfile.NamedTemporaryFile(delete=False) as f:
path = f.name
# do something
finally:
if path:
import os
try:
os.unlink(path)
except FileNotFoundError:
pass
坑 4:Windows 下重复打开失败
这是最经典的兼容性问题。
记住一个原则:
需要通过路径再次访问时,优先考虑先关闭文件,再重新打开。
坑 5:把临时目录当永久存储目录
临时目录不是长期存储方案。
它可能被系统清理、被运维策略清理、被容器重建清理。
所以:
❌ 不要把临时文件当作业务持久化数据
✅ 临时文件只应该承担中间态职责
坑 6:误以为离开函数作用域就一定删掉
如果你没有用 with,或者对象引用没及时释放,
清理时机可能比你想象得更晚。
不推荐这样写:
python
f = tempfile.NamedTemporaryFile()
# 依赖垃圾回收自动关闭删除
推荐始终用上下文管理器:
python
with tempfile.NamedTemporaryFile() as f:
...
坑 7:高并发场景下自己拼文件名
不要自作聪明写这种逻辑:
python
filename = f"/tmp/task_{user_id}.txt"
你可能会遇到:
- 覆盖别人的文件
- 并发写冲突
- 安全问题
- 脏数据互串
只要是临时文件,就让 tempfile 负责命名。
坑 8:以为临时文件永远在磁盘上
比如 SpooledTemporaryFile(),前期可能根本还在内存里。
你如果写了依赖"真实文件路径"的逻辑,就会出问题。
所以在设计时一定要分清:
- 你需要的是"文件对象"
- 还是"可访问路径"
这两个需求,选的 API 可能完全不同。
十二、tempfile 的安全价值,别只停留在"方便"
很多人理解 tempfile,只看到"自动删除,很方便"。
但它更重要的一层价值,是安全性。
如果你手工写临时文件,比如:
python
path = "/tmp/my_temp.txt"
就可能面临以下风险:
- 文件名可预测
- 竞争条件
- 被其他用户抢先创建
- 被恶意符号链接利用
- 产生权限问题
而 tempfile 在设计上就尽量规避了这些问题,尤其是底层的 mkstemp() 这类接口,本质上就是更安全地创建唯一文件。
结论很直接
临时文件不只是"方便文件",更是"安全文件"。
十三、怎么选 API:一张表看懂
下面这张表,可以当成日常选型速查表。
| 需求 | 推荐 API | 说明 |
|---|---|---|
| 只在当前进程里短暂使用文件对象 | TemporaryFile() |
简单直接,自动清理 |
| 需要一个真实文件路径 | NamedTemporaryFile() |
可传给其他库或外部程序 |
| 需要临时工作目录 | TemporaryDirectory() |
多文件场景首选 |
| 小数据先放内存,大数据自动落盘 | SpooledTemporaryFile() |
兼顾性能和内存 |
| 需要底层文件描述符控制 | mkstemp() |
更灵活,但要自己清理 |
| 只想创建目录并完全自己管理 | mkdtemp() |
手动清理目录 |
十四、生产环境里的最佳实践
下面这些建议,基本都是真实项目里总结出来的。
1. 优先使用 with
这不仅是"写法优雅",更是为了确保异常时也能清理资源。
python
with tempfile.TemporaryDirectory() as temp_dir:
...
2. 需要跨进程/跨库访问时,用 NamedTemporaryFile(delete=False)
然后在 finally 里删除。
这是非常稳的工程化方案。
3. 多个中间文件时,用临时目录,不要散着建
一个任务一个临时目录,目录中再组织多个文件,是最清晰的。
4. 大文件处理,不要无脑全放内存
能用 SpooledTemporaryFile() 的场景,可以大幅减少内存压力。
5. 显式指定后缀名
特别是外部工具、三方库、测试场景里,这一点很容易救命。
python
suffix=".json"
suffix=".csv"
suffix=".png"
6. 清理逻辑写在 finally
尤其当你使用 delete=False、mkstemp()、mkdtemp() 时。
7. 调试时可以暂时保留临时文件
线上默认清理,排查问题时允许通过配置关闭清理,这是一种很常见的做法。
例如:
python
import os
import tempfile
DEBUG_KEEP_TEMP = os.getenv("DEBUG_KEEP_TEMP") == "1"
temp_file = tempfile.NamedTemporaryFile(delete=not DEBUG_KEEP_TEMP)
这个思路在定位复杂问题时很好用。
十五、一个完整示例:下载、处理、输出、清理
下面给一个稍微完整一点的示例,模拟真实业务流:
- 创建临时目录
- 下载或生成原始数据
- 处理中间文件
- 输出结果
- 自动清理全过程
python
import json
import tempfile
from pathlib import Path
def run_pipeline():
with tempfile.TemporaryDirectory(prefix="pipeline_") as temp_dir:
temp_dir = Path(temp_dir)
raw_path = temp_dir / "raw.json"
cleaned_path = temp_dir / "cleaned.json"
result_path = temp_dir / "result.txt"
raw_data = {
"name": "tempfile",
"category": "python stdlib",
"tags": ["file", "temp", "safe"]
}
raw_path.write_text(
json.dumps(raw_data, ensure_ascii=False, indent=2),
encoding="utf-8"
)
data = json.loads(raw_path.read_text(encoding="utf-8"))
data["tags"] = [tag.upper() for tag in data["tags"]]
cleaned_path.write_text(
json.dumps(data, ensure_ascii=False, indent=2),
encoding="utf-8"
)
result_path.write_text(
f"模块:{data['name']}\n标签数量:{len(data['tags'])}",
encoding="utf-8"
)
return result_path.read_text(encoding="utf-8")
print(run_pipeline())
这个例子虽然简单,但思路非常适合工程实践:
- 所有中间态都收敛在一个临时目录
- 逻辑结束自动清理
- 文件结构清晰
- 便于扩展为更复杂的数据流水线
十六、我最推荐的使用心法
如果只让我给 tempfile 提 4 条经验,我会给这 4 条:
1. 临时文件不是"随便找个路径"
而是一种需要认真管理的资源。
2. 先问自己:你要的是"文件对象"还是"文件路径"
这个问题一想清楚,API 选型基本就对了。
3. 多文件任务优先考虑 TemporaryDirectory()
这往往比到处建临时文件更优雅。
4. 涉及跨平台时,对 NamedTemporaryFile() 要格外谨慎
尤其是 Windows 下的再次打开问题,别等上线后才踩坑。
十七、结尾
tempfile 不是那种"看一眼文档就结束"的模块。
它表面上很小,实际却和文件系统、安全性、资源管理、跨平台兼容性、性能取舍都密切相关。
很多 Python 开发者平时对它的印象只是:
"哦,就是创建临时文件的那个模块。"
但真正把它用好之后你会发现,它解决的从来不只是"临时"这两个字,而是:
- 如何安全地生成文件
- 如何优雅地管理生命周期
- 如何在复杂业务里避免脏数据和资源泄漏
- 如何写出更稳的跨平台代码
如果你以前还在手写 /tmp/xxx.txt,那从今天开始,真的可以停下来了。🙂
十八、附:一份速查清单
创建匿名临时文件
python
import tempfile
with tempfile.TemporaryFile(mode="w+t", encoding="utf-8") as f:
f.write("hello")
f.seek(0)
print(f.read())
创建带名字的临时文件
python
import tempfile
with tempfile.NamedTemporaryFile(mode="w+t", encoding="utf-8") as f:
print(f.name)
创建临时目录
python
import tempfile
with tempfile.TemporaryDirectory() as d:
print(d)
创建小文件走内存、大文件自动落盘的临时文件
python
import tempfile
with tempfile.SpooledTemporaryFile(max_size=1024, mode="w+t", encoding="utf-8") as f:
f.write("hello")
底层方式创建临时文件
python
import os
import tempfile
fd, path = tempfile.mkstemp()
try:
with os.fdopen(fd, "w", encoding="utf-8") as f:
f.write("hello")
finally:
os.unlink(path)
十九、总结
tempfile 最值得掌握的,不是"怎么创建",而是"什么时候该用哪一个"。
你可以这样记:
- 只在进程内临时使用 :
TemporaryFile - 需要路径给别的程序/库 :
NamedTemporaryFile - 一整个临时工作空间 :
TemporaryDirectory - 想平衡内存和磁盘 :
SpooledTemporaryFile - 想自己接管底层控制 :
mkstemp/mkdtemp
当你把这些边界理解清楚以后,tempfile 就会从一个"不起眼的小模块",变成你写文件相关代码时非常可靠的一把工具刀。