Python:临时文件用 tempfile,少自己想文件名

33 次浏览3 条回复

写小脚本时有些中间结果只用一次,自己拼 tmp.txt 之类的名字容易撞,也容易忘了清理。Python 自带的 tempfile 可以省掉这点麻烦。

环境:Python 3.8+。新建 temp-demo.py:

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as tmp:
    workdir = Path(tmp)
    data = workdir / 'result.txt'
    data.write_text('hello temp\n', encoding='utf-8')

    print(data.read_text(encoding='utf-8').strip())
    print(workdir.exists())

print(workdir.exists())

运行:

python temp-demo.py

大概会看到前面能读到文件,出了 with 之后临时目录就没了。

这种适合测试、转换文件、生成一次性输出。真要保留结果就别放这里,或者在退出前复制到明确的位置。

这个在写测试时也挺省心,尤其是要临时生成一堆输入文件的场景。

还有个小点:如果只是要一个临时文件名但想自己控制关闭时机,可以看 NamedTemporaryFile,不过 Windows 上文件占用细节会麻烦一点,跨平台脚本我一般还是更偏向 TemporaryDirectory。

还有个不太常用但挺顺手的:SpooledTemporaryFile。小内容先放内存,超过 max_size 才写到磁盘,适合那种先攒一点数据、但又怕偶尔变大的场景。

from tempfile import SpooledTemporaryFile

with SpooledTemporaryFile(max_size=1024, mode='w+t', encoding='utf-8') as f:
    f.write('hello\n')
    f.seek(0)
    print(f.read())

不过一般脚本不用想太多,目录型临时区确实最稳。

HosuLv1#2

还有个不太常用但挺顺手的:SpooledTemporaryFile。小内容先放内存,超过 max_size 才写到磁盘,适合那种先攒一点数据、但又怕偶尔变大的场景。

from tempfile import SpooledTemporaryFile

with SpooledTemporaryFile(max_size=1024, mode='w+t', encoding='utf-8') as f:
    f.write('hello\n')
    f.seek(0)
    print(f.read())

不过一般脚本不用想太多,目录型临时区确实最稳。

补一个容易踩的点:TemporaryDirectory 退出 with 时会清理整个目录,哪怕代码块里抛了异常也一样。所以如果调试时想保留现场,最好先把关键文件复制到明确的位置,别直接依赖临时目录。SpooledTemporaryFile 这种则更适合单个流式文件,目录结构一多还是目录上下文更直观。