Python 临时文件、目录的生成
1. 问题
创建一个临时文件夹或目录,并希望使用完之后自动销毁。
2. 解决方案
tempfile
模块中很多的函数可以完成这任务。
创建一个匿名临时文件,可以使用tempfile.TemporaFile
。这种方式文件会自动销毁。
from tempfile import TemporaryFile
with TemporaryFile('w+t') as f:
# Read/write to the file
f.write('Hello World\n')
f.write('Testing\n')
# 返回到开头并读取数据
f.seek(0)
data = f.read()
print(data)
f = TemporaryFile('w+t')
f.write('Hello World\n')
f.write('Testing')
f.seek(0)
print(f.read())
上述两种方法等价。输出:
Hello World
Testing
TemporaFile
的第一个参数是文件模式,文本模式使用w+t
,二进制模式使用w+b
。TemporaryFile()
另外还支持跟内置的 open()
函数一样的参数。
with TemporaryFile('w+t', encoding='utf-8', errors='ignore') as f:
创建有名字的临时文件。可以使用NamedTemporaryFile()
。这种方式文件会自动销毁。
from tempfile import NamedTemporaryFile
f = NamedTemporaryFile(prefix='mytemp', suffix='.md', dir='C:/Users/T14/AppData/Local/Temp/')
print(f.name)
C:\Users\T14\AppData\Local\Temp\mytempcecb12hp.md
创建临时目录。可以使用tempfile.TemporaryDirectory
。
from tempfile import TemporaryDirectory
dir = TemporaryDirectory()
print(dir.name)
with TemporaryDirectory() as dirname:
print(dirname)
上述两种方法等价。输出:
C:\Users\T14\AppData\Local\Temp\tmpac0p48m1
C:\Users\T14\AppData\Local\Temp\tmphjcngywq
3. 讨论
TemporaryFile()
、NamedTemporaryFile()
和 TemporaryDirectory()
是处理临时文件、目录的最简单的方式了,因为它们会自动处理所有的创建和清理步骤。 在一个更低的级别,你可以使用 mkstemp()
和 mkdtemp()
来创建临时文件和目录。比如:
import tempfile
tmp = tempfile.mkstemp() # 生成临时文件
print(tmp)
print(tempfile.gettempdir()) # 查看临时文件、目录路径
tmp2 = tempfile.mkdtemp() # 生成临时目录
print(tmp2)
print(tempfile.gettempdir())
(3, 'C:\\Users\\T14\\AppData\\Local\\Temp\\tmp8al28qr3')
C:\Users\T14\AppData\Local\Temp
C:\Users\T14\AppData\Local\Temp\tmphdj6ac__
C:\Users\T14\AppData\Local\Temp
但是,这些函数并不会做进一步的管理了。 例如,函数 mkstemp()
仅仅就返回一个原始的OS文件描述符,你需要自己将它转换为一个真正的文件对象。 同样你还需要自己清理这些文件。
所有和临时文件相关的函数都允许你通过使用关键字参数 前缀prefix
、后缀suffix
和 文件路径dir
来自定义目录以及命名规则。比如:
f = NamedTemporaryFile(prefix='mytemp', suffix='.md', dir='C:/Users/T14/AppData/Local/Temp/')
print(f.name)
C:\Users\T14\AppData\Local\Temp\mytempyqr3xvy7.md
最后一点,尽可能以最安全的方式使用 tempfile
模块来创建临时文件。