Python创建临时文件和文件夹

所属分类: 脚本专栏 / python 阅读数: 1445
收藏 0 赞 0 分享

问题

你需要在程序执行时创建一个临时文件或目录,并希望使用完之后可以自动销毁掉。

解决方案

tempfile 模块中有很多的函数可以完成这任务。 为了创建一个匿名的临时文件,可以使用 tempfile.TemporaryFile

from tempfile import TemporaryFile

with TemporaryFile('w+t') as f:
  # Read/write to the file
  f.write('Hello World\n')
  f.write('Testing\n')

  # Seek back to beginning and read the data
  f.seek(0)
  data = f.read()

# Temporary file is destroyed

或者,如果你喜欢,你还可以像这样使用临时文件:

f = TemporaryFile('w+t')
# Use the temporary file
...
f.close()
# File is destroyed

TemporaryFile() 的第一个参数是文件模式,通常来讲文本模式使用 w+t ,二进制模式使用 w+b 。 这个模式同时支持读和写操作,在这里是很有用的,因为当你关闭文件去改变模式的时候,文件实际上已经不存在了。 TemporaryFile() 另外还支持跟内置的 open() 函数一样的参数。比如:

with TemporaryFile('w+t', encoding='utf-8', errors='ignore') as f:
  ...

在大多数Unix系统上,通过 TemporaryFile() 创建的文件都是匿名的,甚至连目录都没有。 如果你想打破这个限制,可以使用 NamedTemporaryFile() 来代替。比如:

from tempfile import NamedTemporaryFile

with NamedTemporaryFile('w+t') as f:
  print('filename is:', f.name)
  ...

# File automatically destroyed

这里,被打开文件的 f.name 属性包含了该临时文件的文件名。 当你需要将文件名传递给其他代码来打开这个文件的时候,这个就很有用了。 和 TemporaryFile() 一样,结果文件关闭时会被自动删除掉。 如果你不想这么做,可以传递一个关键字参数 delete=False 即可。比如:

with NamedTemporaryFile('w+t', delete=False) as f:
  print('filename is:', f.name)
  ...

为了创建一个临时目录,可以使用 tempfile.TemporaryDirectory() 。比如:

from tempfile import TemporaryDirectory

with TemporaryDirectory() as dirname:
  print('dirname is:', dirname)
  # Use the directory
  ...
# Directory and all contents destroyed

讨论

TemporaryFile()NamedTemporaryFile() TemporaryDirectory() 函数 应该是处理临时文件目录的最简单的方式了,因为它们会自动处理所有的创建和清理步骤。 在一个更低的级别,你可以使用 mkstemp() mkdtemp() 来创建临时文件和目录。比如:

>>> import tempfile
>>> tempfile.mkstemp()
(3, '/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-/tmp7fefhv')
>>> tempfile.mkdtemp()
'/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-/tmp5wvcv6'
>>>

但是,这些函数并不会做进一步的管理了。 例如,函数 mkstemp() 仅仅就返回一个原始的OS文件描述符,你需要自己将它转换为一个真正的文件对象。 同样你还需要自己清理这些文件。

通常来讲,临时文件在系统默认的位置被创建,比如 /var/tmp 或类似的地方。 为了获取真实的位置,可以使用 tempfile.gettempdir() 函数。比如:

>>> tempfile.gettempdir()
'/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-'
>>>

所有和临时文件相关的函数都允许你通过使用关键字参数 prefix suffixdir 来自定义目录以及命名规则。比如:

>>> f = NamedTemporaryFile(prefix='mytemp', suffix='.txt', dir='/tmp')
>>> f.name
'/tmp/mytemp8ee899.txt'
>>>

最后还有一点,尽可能以最安全的方式使用 tempfile 模块来创建临时文件。 包括仅给当前用户授权访问以及在文件创建过程中采取措施避免竞态条件。 要注意的是不同的平台可能会不一样。因此你最好阅读 官方文档 来了解更多的细节。

以上就是Python创建临时文件和文件夹的详细内容,更多关于Python临时文件和文件夹的资料请关注脚本之家其它相关文章!

更多精彩内容其他人还在看

深入源码解析Python中的对象与类型

这篇文章主要介绍了深入源码解析Python中的对象与类型,涉及到对象的引用计数方法和类型的定义等深层次内容,需要的朋友可以参考下
收藏 0 赞 0 分享

一篇文章入门Python生态系统(Python新手入门指导)

原文写于2011年末,虽然文中关于Python 3的一些说法可以说已经不成立了,但是作为一篇面向从其他语言转型到Python的程序员来说,本文对Python的生态系统还是做了较为全面的介绍
收藏 0 赞 0 分享

Python实时获取cmd的输出

本文给大家分享python实时获取cmd的输出,对python实时获取输出相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

分享Python字符串关键点

字符串是 Python 中最常用的数据类型。我们可以使用引号来创建字符串,通过本篇文章给大家分享python字符串关键点相关资料,感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

Python中内置数据类型list,tuple,dict,set的区别和用法

这篇文章主要给大家介绍了Python中内置数据类型list,tuple,dict,set的区别和用法,都是非常基础的知识,十分的细致全面,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

Python学习笔记整理3之输入输出、python eval函数

这篇文章主要介绍了Python学习笔记整理3之输入输出、python eval函数的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

十个Python程序员易犯的错误

不管是在学习还是工作过程中,人都会犯错。虽然Python的语法简单、灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头。本文为大家分享了10大常见错误,需要的朋友可以参考下
收藏 0 赞 0 分享

使用Python编写简单的端口扫描器的实例分享

这篇文章主要介绍了使用Python编写简单的端口扫描器的实例分享,文中分别介绍了单线程和多线程的实现方式,需要的朋友可以参考下
收藏 0 赞 0 分享

用ReactJS和Python的Flask框架编写留言板的代码示例

这篇文章主要介绍了用ReactJS和Python的Flask框架编写留言板的代码示例,其他的话用到了MongoDB这个方便使用JavaScript来操作的数据库,需要的朋友可以参考下
收藏 0 赞 0 分享

在DigitalOcean的服务器上部署flaskblog应用

这篇文章主要介绍了在DigitalOcean的服务器上部署flaskblog的方法,flaskblog是用Python的Flask开发的一个博客程序,而DigitalOcean则是大受欢迎的SSD主机提供商,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多