Python 临时文件模块 tempfile

王 茂南 2021年10月9日07:37:44
评论
2017字阅读6分43秒
摘要本文会介绍 Python 创建临时文件,临时文件夹的模块 tempfile。其中使用 TemporaryFile 类创建「临时文件」,使用 mkdtemp 方法创建「临时文件夹」。

简介

在一些场景中我们经常需要自动生成一些临时文件,当然我们可以使用 open 函数,来创建一个隐藏文件。不过 tempfile 这个模块把常用的功能全部都封装完毕,我们直接使用即可。

例如我们可以使用 tempfile 创建一个只对某个程序使用的隐藏文件,同时这个程序关闭后文件会自动删除。我们也可以创建一个文件被多个进程或主机使用。需要注意的是,不要去找临时文件或临时文件夹,因为程序退出时该临时文件和临时文件夹都会被删除。在这一篇中,我们会介绍关于 tempfile 模块的使用。

参考资料

 

tempfile 的简单使用

使用 TemporaryFile 创建临时文件

TemporaryFile 类是 tempfile 中最常用的类之一。使用 TemporaryFile 创建的临时文件有以下的特征:

  • 对应的文件没有文件名,对除了本程序之外的程序不可见;
  • 在被关闭的同时被删除;

下面我们看一个简单的例子,新建一个临时文件,写入「hello world」内容,然后将其打印出来:

  1. import tempfile
  2. temp_file = tempfile.TemporaryFile()
  3. print(temp_file.name) # 打印文件路径
  4. # 写入临时文件
  5. temp_file.write(b'hello, world') # 写入内容
  6. # 读取临时文件内容
  7. temp_file.seek(0)     # 从头读取,和一般文件对象不同,seek方法的执行不能少
  8. print(temp_file.read())
  9. # 关闭文件的同时删除文件
  10. temp_file.close()

上面一种方法是手动创建文件,对文件读写之后再手动进行关闭。我们也可以使用 with 语句来创建临时文件,这样不需要考虑手动关闭。下面是使用「with」来创建临时文件的例子:

  1. import tempfile
  2. with tempfile.TemporaryFile() as temp_file:
  3.     # 写入内容
  4.     temp_file.write('两情若是久长时,'.encode('utf-8'))
  5.     temp_file.write('又岂在朝朝暮暮。'.encode('utf-8'))
  6.     # 将文件指针移到开始处,准备读取文件
  7.     temp_file.seek(0)
  8.     # 读取文件内容
  9.     print(temp_file.read().decode('utf-8'))

在 TemporaryFile 类的基础上有两个衍生的类:

  • NamedTemporaryFile 类是在前者的基础上,初始化时加上了 delete 参数,默认值为 True。当此参数为 True 时和 TemporaryFile 类完全一致。如果是 False,那么临时文件对象在被关闭时不会删除。因此可以在下面的代码中通过同样的对象再次打开。
  • 另一个是 SpooledTemporaryFile,它在 TemporaryFile 的基础上增加了一个 max_size 参数默认值为 0。当这个类的对象调用 write 方法向临时文件中写入内容时,这些内容暂时先存在于缓存中,只有当内容大小达到了 max_size 指定的大小,才会写入文件。

 

使用 mkdtemp 创建临时文件夹

tempfile 中还有创建临时目录的功能,如 tempfile.mkdtemp 方法。这个方法做的事情是在系统指定的临时目录下(比如TEMP,TEMPDIR这些环境变量指向的目录)创建一个临时目录。下面是一个创建「临时文件夹」的例子,我们在这个「临时文件夹」下在生成多个「临时文件」,并写入内容。

  1. import tempfile
  2. with tempfile.TemporaryDirectory() as tmpdirname:
  3.     print('创建临时目录', tmpdirname)
  4.     with tempfile.TemporaryFile(dir=tmpdirname) as f1, tempfile.TemporaryFile(dir=tmpdirname) as f2:
  5.         # 写入内容
  6.         f1.write(b'The First File.')
  7.         f2.write(b'The Second File.')
  8.         # 文件指针移动到开始处
  9.         f1.seek(0)
  10.         f2.seek(0)
  11.         # 读取文件内容
  12.         print('文件一 {}, {}'.format(f1.name, f1.read()))
  13.         print('文件二 {}, {}'.format(f2.name, f2.read()))

上面的代码最终运行结果如下所示,可以看到两个「临时文件」在创建的「临时文件夹」内:

Python 临时文件模块 tempfile

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2021年10月9日07:37:44
  • 转载请务必保留本文链接:https://mathpretty.com/14140.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: