创建临时文件和文件夹

问题

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

解法

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

from tempfile import TemporaryFilewith TemporaryFile('w+t') as f:# Read/write to the filef.write('Hello World\n')f.write('Testing\n')# Seek back to beginning and read the dataf.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 NamedTemporaryFilewith NamedTemporaryFile('w+t') as f:print('filename is:', f.name)...# File automatically destroyed

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

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

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

from tempfile import TemporaryDirectorywith 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 、 suffix 和 dir来自定义目录以及命名规则。比如:

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

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

《Python Cookbook 3rd》笔记(5.19):创建临时文件和文件夹相关推荐

  1. c语言创建临时文件,5.19 创建临时文件和文件夹

    问题 你需要在程序执行时创建一个临时文件或目录,并希望使用完之后可以自动销毁掉. 解决方案 tempfile 模块中有很多的函数可以完成这任务.为了创建一个匿名的临时文件,可以使用 tempfile. ...

  2. 创建临时文件及文件夹

    创建临时文件及文件夹 创建临时文件存储数据 1.临时文件的读取以光标为准 2.光标后存在内容,会进行文本覆盖 3.临时文件销毁后不能再进行二次读写 创建临时文件夹 创建临时文件存储数据 在临时文件进行 ...

  3. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  4. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  5. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  6. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  7. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  8. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  9. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

最新文章

  1. [转]SQL Server开发技巧
  2. 聊聊flink的CsvTableSink
  3. SLAM: 图像角点检测的Fast算法(OpenCV文档)
  4. java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一
  5. src与href属性的区别
  6. 微服务、容器和Kubernetes的2020你怎么看?
  7. docker 磁盘问题:device or resource busy
  8. java中计时器的用法Timer和TimerTask的用法__java中利用Timer与TImerTask 计时器间隔执行任务...
  9. 2018-03-28 从人机交互角度看中文编程:#39;打开微信#39;
  10. python3.7安装pyqt4_Windows下PyQt4的安装(本文已过期)
  11. Regular expressions in lexing and parsing(翻译)
  12. Scollector+Bosun+OpenTSDB的监控方案逻辑组网
  13. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_2_函数式接口的使用...
  14. 软件定义网络带来新的自动化优势和挑战
  15. python去除视频马赛克_python使用opencv实现马赛克效果示例
  16. 程序员,我要为了这个名号而疯狂
  17. 2022年旅游业数据分析报告
  18. 指爱打字群添雨跟打器使用教程(指爱群新手教程)-by指爱群友
  19. 「ASO优化服务」APP如何做数据分析
  20. 京东云无线宝可以服务器吗,京东云无线宝哪种上网方式收益最高,这点你一定得知道...

热门文章

  1. 深入浅出VC++串口编程之基于Win32 API
  2. c语言内循环,C语言循环控制语句
  3. git 新建分支并切换到该分支_Git何谓分支
  4. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(四)
  5. 【转】Asp.net的生命周期之应用程序生命周期
  6. C#多线程编程系列(一)- 简介
  7. 一步步编写操作系统 27 处理器微架构之流水线简介
  8. 依赖注入和控制反转的理解,写的太好了。
  9. php对接钉钉_php实现钉钉业务报警机器人
  10. professional中文_Microsoft office 2007 简体中文版