【python 内置模块】tempfile

2024-01-20 00:00:00

目录:

tempfile 用于安全创建临时文件和目录,能够确保在程序运行过程中生成的临时数据得到妥善管理,适合处理那些不需要长期保存但程序运行期间又必需的中间数据,比如缓存文件、日志文件或临时配置文件等。

获取系统临时目录信息

在创建临时文件前,有时需要了解系统的默认临时目录位置和文件名前缀。

import tempfile

# 获取默认临时目录路径(字符串格式)
temp_dir = tempfile.gettempdir()
print(f"系统临时目录: {temp_dir}")  # 例如: /tmp 或 C:\Users\...\AppData\Local\Temp[2](@ref)[5](@ref)

# 获取字节格式的临时目录路径
temp_dir_b = tempfile.gettempdirb()
print(f"临时目录(bytes): {temp_dir_b}")

# 获取临时文件默认前缀
prefix = tempfile.gettempprefix()
print(f"临时文件前缀: {prefix}")  # 通常为 'tmp'

创建自动清理的临时文件

TemporaryFile 创建的临时文件在文件系统中可能没有可见名称(尤其在 Unix 系统),关闭后会自动删除,非常适合存储私有临时数据。

import tempfile

# 方法一:手动管理
fp = tempfile.TemporaryFile(mode='w+b')  # 默认模式,可读写二进制数据
fp.write(b'Hello, temporary world!')
fp.seek(0)  # 将文件指针移回开头
data = fp.read()
print(f"读取的数据: {data}")
fp.close()  # 文件关闭,自动删除

# 方法二:使用上下文管理器(推荐)
with tempfile.TemporaryFile(mode='w+t') as fp:  # 文本模式
    fp.write('这是一段临时文本数据。')
    fp.seek(0)
    print(fp.read())
# 退出 with 块后,文件自动关闭并删除

创建有名称的临时文件

与 TemporaryFile 不同,NamedTemporaryFile 确保文件在文件系统中有一个可见的名称(可通过 .name 属性获取),这在需要让其他进程或函数知道文件路径时非常有用。

import tempfile
import os

# 创建临时文件,默认 delete=True,关闭后删除
with tempfile.NamedTemporaryFile(mode='w+t', suffix='.log', prefix='myapp_') as ntf:
    print(f"临时文件路径: {ntf.name}")
    ntf.write('Application log entry...\n')
    # 在文件仍打开时,某些平台(如 Unix)允许用此路径再次打开文件
    ntf.flush()
    # 可以在此将 ntf.name 传递给其他需要文件路径的函数

# 创建临时文件但不自动删除(delete=False)
ntf = tempfile.NamedTemporaryFile(mode='w+b', delete=False, suffix='.dat')
try:
    ntf.write(b'\x00\x01\x02')
    file_path = ntf.name
finally:
    ntf.close()
# 此时文件仍存在,可后续操作
print(f"文件仍存在: {os.path.exists(file_path)}")
os.unlink(file_path)  # 手动删除

创建临时目录

临时目录适合需要创建多个临时文件或复杂目录结构的场景。

import tempfile
import os

with tempfile.TemporaryDirectory(suffix='_cache', prefix='download_') as tmpdir:
    print(f"创建的临时目录: {tmpdir}")
    # 在临时目录中创建文件
    temp_file_path = os.path.join(tmpdir, 'part1.txt')
    with open(temp_file_path, 'w') as f:
        f.write('Partial download data.')
    # 可以在此进行一系列文件操作...
    print(f"目录内容示例: {os.listdir(tmpdir)}")
# 退出 with 块后,整个目录及其内容被自动递归删除

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: