Python编程基础 - 使用临时文件和临时目录

简介: Python编程基础 - 使用临时文件和临时目录

Python编程基础 - 使用临时文件和临时目录


【导读】:本文先介绍了什么是临时文件,然后围绕Python内建模块Temporary讲解了如何管理和使用临时文件。

软件开发过程中有时会遇到遇到的某些文件只在一个相对较短的时间范围内有用的情况,这些文件即所谓临时文件。对于这些文件我么甚至不关心他们叫什么,毕竟他们仅仅在其生命周期内产生特定的作用。当他们不再有用时,如果还残留在计算机中,就成为了所谓的垃圾文件。

对于程序设计者而言,我们当然不想每一次都为这些琐碎的文件都起一个名字,指定一个存储路径,然后去找寻使用该文件,并最后还要通过代码或者手动的方式去删除他们。因此,一个专门管理和使用临时目录及文件的编程模块就显得必要。庆幸的是,在Python中已经为我们提供了这样一个模块——他就是tempfile。无需额外安装,你可以直接将其导入在你的代码中以进行使用它所提供的相应接口:

import tempfile

该模块提供了图示的一些接口:

如果你只想导入其中的某个对象,那么也可以参照下面的写法完成导入:

from tempfile import TemporaryFile, TemporaryDirectory

接下来,我们将详细了解该模块中的各个接口函数。

1. TemporaryFile()函数 - 用于创建临时文件。

  • 文件将像mkstemp()函数所做的那样被创建。先看接口信息:
def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
                   newline=None, suffix=None, prefix=None,
                   dir=None, *, errors=None):
   """创建并返回一个临时文件
   Arguments:
   'prefix', 'suffix', 'dir' -- as for mkstemp.
   'mode' -- io.open的模式参数 (默认为"w+b").
   'buffering' -- io.open的缓冲区大小参数 (默认为 -1).
   'encoding' -- io.open的编码参数 (默认为 None)
   'newline' -- io.open的换行符参数 (默认为 None)
   'errors' -- io.open的errors参数 (默认为 None)
   返回具有类似文件的接口的对象。该文件没有名称,关闭后将不再存在。
   """

【示例1】使用TemporaryFile()创建临时文件(1)

import tempfile
fp = tempfile.TemporaryFile() # 创建一个临时文件
fp.write(b'Hello world!')     # 向该零时文件中写入一些数据
fp.seek(0) # 从文件中读取数据
fp.read()

Out[]:b’Hello world!’

这时产生一个临时文件,你往往可能看不到它,但是它确实存在。且能够使用,正像上述代码中展示的那样。

fp.close()

关闭文件,这时该临时文件就自动删除了

【示例2】使用TemporaryFile()创建临时文件(2)—— 使用上下文管理器创建临时文件

# 使用上下文管理器创建临时文件
with tempfile.TemporaryFile() as fp:
    fp.write(b'Hello world!')
    fp.seek(0)
    data = fp.read()
data

Out[]:b’Hello world!’

运行至此文件将被自动地关闭并删除,这时使用上下文管理器的便利之处。

2.TemporaryDirectory()类 - 用于创建临时目录

创建并返回一个临时目录。这与mkdtemp()函数具有相同的行为(实际上TemporaryDirectory类初始化时将调用mkdtemp()函数),但可以用作上下文管理器。

【示例3】使用TemporaryFile()创建临时目录

with tempfile.TemporaryDirectory() as tmpdirname:
    print('创建临时目录:', tmpdirname)

Out[]:创建临时目录: C:\Users\JackLee\AppData\Local\Temp\tmpj4h3mfqn

同理,在上下文管理器中运行至此,该临时目录也已经被自动删除。

3. NamedTemporaryFile()函数 - 创建具有可见名称的临时文件

此函数执行的操作与 TemporaryFile() 完全相同,但确保了该临时文件在文件系统中具有可见的名称(在 Unix 上表现为目录条目不取消链接)。

  • 从返回的文件类对象的 name 属性中可以检索到文件名。
  • 在临时文件仍打开时,是否允许用文件名第二次打开文件,在各个平台上是不同的(在 Unix 上可以,但在 Windows NT 或更高版本上不行)。
  • 如果 delete 为 true(默认值),则文件会在关闭后立即被删除。
  • 该函数返回的对象始终是文件类对象 (file-like object),它的 file 属性是底层的真实文件对象。
  • 文件类对象可以像普通文件一样在 with 语句中使用。
    接口信息如下:
def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
                       newline=None, suffix=None, prefix=None,
                       dir=None, delete=True, *, errors=None):
    """创建并返回一个临时文件
    参数表:
    'prefix', 'suffix', 'dir':   传给mkstemp()函数所用的参数.
    'mode':                      io.open的模式参数(默认为"w+b").
    'buffering':                 io.open的缓冲区大小参数 (默认为-1).
    'encoding':                  io.open的编码参数 (默认为None)
    'newline':                   io.open的换行符参数(默认为None)
    'delete':                    文件是否在关闭时被删除 (默认为True).
    'errors':                    io.open的errors参数 (默认为None)
    创建的文件正如mkstemp()函数所做的那样.
    返回具有类似文件的接口的对象;文件的名称可作为其"name"属性访问。
    文件关闭时将自动删除,除非"delete"参数设置为“False”。
    """

4. SpooledTemporaryFile()函数 - 创建内存临时文件

此函数执行的操作与 TemporaryFile() 完全相同,但会将数据缓存在内存中直到文件大小超过 max_size,或调用文件的 fileno() 方法为止,此时数据会被写入磁盘,并且写入操作与 TemporaryFile() 相同。

此函数生成的文件对象有一个额外的方法——rollover(),可以忽略文件大小,让文件立即写入磁盘。

5. mkstemp()函数 - 创建临时文件,但需要调用者自己删除之

  • 其接口信息如下:
def mkstemp(suffix=None, prefix=None, dir=None, text=False):
    """用户可调用函数创建并返回一个唯一的临时文件。
    返回值是一对(fd,name),其中fd是os.open返回的文件描述符,name是文件名。
    如果'suffix'不是None, 文件名将以suffix结尾,否则没有suffix(后缀)。
    如果'prefix'不是None, 文件名将以prefix开始,否则将使用一个默认的prefix(前缀)
    如果'dir'不是None, 文件将在该目录(directory)中创建,否则将使用默认目录。
    如果指定了'text'并且为True,则以文本模式打开文件。  
    否则(也是默认) 文件将以二进制形式打开.
    如果'suffix', 'prefix' 和 'dir' 其中之一不是 None, 那么他们必须时一样的类型。
    如果他们的类型为 bytes, 那么返回的name将是 bytes; str。
    文件只能由创建用户标识来读写。如果操作系统使用权限位来指示文件是否可执行,则该文件不可由任何人执行。文件描述符不由该进程的子进程继承。 
    调用者自己需要负责删除文件。
    """

6. mkdtemp()函数 - 创建临时目录,但需要调用者自己删除之

可以参考TemporaryDirectory的用法。

目录
相关文章
|
6天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
6天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
6天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
7天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
8天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
1月前
|
安全 测试技术 数据库
Python编程--sys模块及OS模块简单用例
Python编程--sys模块及OS模块简单用例
|
1月前
|
JSON 数据格式 Python
Python编程:利用JSON模块编程验证用户
Python编程:利用JSON模块编程验证用户
|
1月前
|
数据处理 Python
Python编程-利用datetime模块生成当前年份之前指定的间隔所有年份的日期列表和csv文件
Python编程-利用datetime模块生成当前年份之前指定的间隔所有年份的日期列表和csv文件
|
6月前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
255 5
|
6月前
|
安全 调度 Python
什么是Python中的事件驱动编程?如何使用`asyncio`模块实现异步事件处理?
【2月更文挑战第4天】【2月更文挑战第9篇】什么是Python中的事件驱动编程?如何使用`asyncio`模块实现异步事件处理?
133 0