Python tempfile 深入实战:安全、优雅地处理临时文件与临时目录

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+b
  • encoding:文本模式时指定编码
  • suffix:文件后缀,比如 .txt
  • prefix:文件名前缀
  • 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 会参考一些环境变量,比如:

  • TMPDIR
  • TEMP
  • TMP

这意味着在容器、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 非常典型的使用方式。

比如你要调用 ffmpegwkhtmltopdflibreofficepandoc 这类外部工具。

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=Falsemkstemp()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 就会从一个"不起眼的小模块",变成你写文件相关代码时非常可靠的一把工具刀。

相关推荐
摩尔曼斯克的海2 小时前
力扣面试题--双指针类
python·算法·leetcode
witAI2 小时前
gemini3.1拆短剧2025解析,多模态模型如何重塑内容创作流程
人工智能·python
love530love2 小时前
Windows 11 源码编译 vLLM 0.16 完全指南(CUDA 12.6 / PyTorch 2.7.1+cu126)
人工智能·pytorch·windows·python·深度学习·comfyui·vllm
zach01273 小时前
GEO优化的算力贫困悖论:基于数字地缘政治的量子搜索语义重构
人工智能·python·重构
AsDuang3 小时前
Python 3.12 MagicMethods - 28 - __rsub__
开发语言·python
李可以量化4 小时前
用 KMeans 聚类寻找股票支撑位与压力位(上):基于 QMT 量化平台实现
python·量化 qmt ptrade
所谓伊人,在水一方3334 小时前
【Python数据科学实战之路】第12章 | 无监督学习算法实战:聚类与降维的奥秘
python·sql·学习·算法·信息可视化·聚类
MoRanzhi12034 小时前
Pillow 灰度化、二值化与阈值处理
图像处理·python·pillow·二值化·图像预处理·阈值处理·灰度化
飞Link4 小时前
告别复杂调参:Prophet 加法模型深度解析与实战
开发语言·python·数据挖掘