迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

在 Python 中创建临时文件

作者:迹忆客 最近更新:2023/04/26 浏览次数:

本文介绍如何在 Python 中创建临时文件和目录。 Python 中的临时文件是使用 tempfile 模块生成的。

本文还讲解了tempfile的四个子函数,分别是TemporaryFile、NamedTemporaryFile、mkstemp和TemporaryDirectory。


使用 tempfile 模块在 Python 中创建临时文件

此函数在 Python 中创建一个安全创建的临时文件,它返回一个类似于可以临时使用的文件的存储区域。 它将在关闭后立即销毁(包括对象被垃圾回收时的隐式关闭)。

使用此函数在 Python 中创建临时文件的语法是:

file = tempfile.TemporaryFile()
#    OR
file = tempfile.TemporaryFile(mode='w+b', #Remains as Default mode if not mentioned
                             suffix=None, #adds a suffix to file name
                             prefix=None, #adds prefix to file name
                              # etc.)

Python 中的这个临时文件将在上下文完成(使用块)或文件对象销毁 file.close() 时从文件系统中删除。 新文件可以在不关闭的情况下进行读写,因为mode参数的默认值为w+b。

它以二进制模式运行,以保持所有系统的一致性,而不管保存的数据如何。 一些额外的术语,如缓冲、编码、错误和换行符是 python 内置函数 open() 的一部分,可以在参数内部使用。

下面的程序演示了如何使用 TemporaryFile() 在 Python 中创建临时文件。

第一行代码导入库包 tmpfile。 创建一个可变文件路径,它使用 tempfile.TemporaryFile() 函数创建一个临时文件。

使用 filepath.write() 函数将数据写入临时文件。 该参数只接受一个字节类型的值,所以在字符串之前添加了文字 b。

filepath.seek(0) 函数从文件流中的长度 0 开始加载文件。

打印变量文件路径显示对象的地址。 要检查临时文件的文件名,将打印函数 filepath.name()。

函数 filepath.read() 从临时文件中读取数据,然后打印出来。 最后,使用 filepath.close() 释放临时文件对象。

import tempfile

filepath = tempfile.TemporaryFile()

filepath.write(b'Writing some stuff')
filepath.seek(0)

print(filepath)
print(filepath.name)

print(filepath.read())
filepath.close()

输出:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x00000285D92DAC50>
C:\Users\WIN10~1\AppData\Local\Temp\st.cq3d03ezloraine
b'Hello world!'

Process finished with exit code 0

让我们看另一个程序。

这里变量文件路径使用了 TemporaryFile 子函数的三个参数。 模式设置为w+b,分别代表读和写。

此外,前缀 st。 并在文件名中添加后缀 loarine。 数据写入临时文件,并打印文件名。

import tempfile

filepath = tempfile.TemporaryFile(mode='w+b',
                                  prefix='st.',  # adds prefix to file name
                                  suffix='loraine',  # adds a suffix to file name
                                  )

filepath.write(b'Hello world!')

print(filepath.name)

filepath.close()

可以看到文件名已经添加了前缀和后缀。

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.kepthvu_loraine

Process finished with exit code 0

可以看出临时文件在程序结束时已经明确关闭。 这样做会关闭文件,但不会删除它。

关闭文件后仍能显示文件名,但无法加载其内容。

在 Python 中读取或写入已关闭的临时文件会导致值错误,这与任何普通文件相同。

import tempfile

filepath = tempfile.TemporaryFile(mode='w+b',
                                  prefix='st.',  # adds prefix to file name
                                  suffix='loraine',  # adds a suffix to file name
                                  )

filepath.write(b'Hello world!')

filepath.close()

print(filepath.name)

filepath.write(b'Hello world!')

输出:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.f7n0s5a6loraine
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    filepath.write(b'Hello world!')
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: write to closed file

Process finished with exit code 1

在 Python 中创建一个命名的临时文件

此函数与 TemporaryFile() 之间的唯一区别在于,此函数确保文件在文件系统中具有可见名称。 返回对象时,可以在 name 属性中找到该名称。

在 UNIX 中,可以使用相同的名称来打开另一个临时文件,即使之前的文件已经打开,但在 Windows 中是禁止的。

默认情况下,Python 中的临时文件设置为一关闭就删除,但是可以通过设置 delete = False 来关闭它。 与普通文件类似,这个类文件对象可以在语句中使用。

使用这个子函数的语法是:

tmp = tempfile.NamedTemporaryFile()
#    OR
tmp = tempfile.NamedTemporaryFile(mode='w+b',
                                  delete=False,
                                  suffix=None,
                                  prefix=None)

要在 Python 中创建一个命名的临时文件,请使用以下程序。

这个程序在这里导入了两个库包,os和tempfile。 使用变量 tempo_file 创建临时文件,删除参数设置为 False,并提供前缀和后缀。

在 try 块内,使用 print(tempo_file) 打印文件对象。 然后,使用 print(tempo_file.name) 打印文件名。

函数 tempo_file.write() 用于写入这个临时文件。

在 finally 块内,使用 tempo_file.close() 关闭文件。 然后使用 os.unlink() 函数,文件名从文件对象中取消链接。

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=False, prefix="Ice", suffix='cream')
try:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b'Peacock is national bird of India')
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

输出:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x000001DE90935C18>
C:\Users\WIN10~1\AppData\Local\Temp\Icez5eghui0cream

Process finished with exit code 0

上面程序中的delete参数设置为False,意思是如果不隐式关闭,则保持打开状态。 如果 delete 参数设置为 True,则文件关闭后无法访问该文件名。

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=True)
try:
    print(tempo_file.name)
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

print(tempo_file.name)

输出:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/ain.py"
C:\Users\WIN10~1\AppData\Local\Temp\tmp6j3xxjzr
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    os.unlink(tempo_file.name)
FileNotFoundError: [WinError 2] The system cannot find the file specified:'C:\\Users\\WIN10~1\\AppData\\Local\\Temp\\tmp6j3xxjzr'

Process finished with exit code 1

with 块很有用,因为它会自动关闭文件。

import tempfile

with tempfile.TemporaryFile(delete=True) as tempo_file:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b'Peacock is national bird of India')

print(tempo_file.read())

输出:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x0000027EB1C09390>
C:\Users\WIN10~1\AppData\Local\Temp\tmpzk_gpkau
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 11, in <module>
    print(tempo_file.read())
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: read of closed file

Process finished with exit code 1

使用 mkstemp 函数在 Python 中创建临时文件

此函数为在 Python 中创建临时文件提供了最高级别的安全性。 只有创建该文件的用户 ID 才有权读取和写入它。

如果平台使用权限位来确定文件是否可执行,则没有人可以执行该文件。 即使是子进程也不会继承文件描述符。

用于 mkstemp 的语法是:

 tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)

与函数 TemporaryFile() 不同,程序员必须在使用 mkstemp() 时隐式删除临时文件。 该函数对 prefix、suffix 和 dir 参数具有独特的作用。

让我们看看它们。

如果未设置为 None,文件名将以给定的后缀结尾; 否则,不会有一个。 如果需要,必须在后缀的开头放置一个点,因为 mkstemp() 不会在文件名和后缀之间放置一个点。

如果有一个而不是无,文件名将以前缀开头; 否则,使用默认前缀。 从 gettempprefix() 或 gettempprefixb() 返回的值作为默认值,无论哪个程序看起来合适。

dir存放临时文件的目录。 如果 dir 未设置为 None,将在给定目录中创建一个文件; 否则,使用默认目录。

默认目录是平台相关的。

通过更改 TMPDIR、TEMP 或 TMP 环境变量,应用程序用户可以从特定于平台的列表中覆盖默认目录的选择。

如果后缀、前缀和目录未设置为 None,则它们必须具有相同的类型。 如果这些是字节,则返回的名称将是字节而不是 str。

传递 suffix=b 将强制返回值中的字节而不是其默认行为。

如果指定了文本且为 True,则文件以文本模式打开。 如果设置为False,系统默认以二进制模式打开文件。

下面的程序使用 mkstemp 创建了一个临时文件。 mkstemp 函数使用两个参数,第一个是文件的标识符,第二个是文件名。

在 try 块内,文件通过其句柄使用 with 块打开。 然后在文件中写入一些数据。

在 finally 块内,使用 os.unlink(filename) 隐式删除文件。

import os
import tempfile

handle, filename = tempfile.mkstemp(suffix=".bat")
try:
    with os.fdopen(handle, "w") as f:
        f.write("signature")
        print(handle)
        print(filename)

finally:
    os.unlink(filename)

输出:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
3
C:\Users\WIN10~1\AppData\Local\Temp\tmp1yvy9j_c.bat

Process finished with exit code 0

在 Python 中创建一个临时目录

这个类安全地创建一个临时目录。 这些对象可以使用像 with 块这样的上下文管理器来使用。

新形成的临时目录及其内容在上下文完成或临时目录对象销毁时从内存中删除。

返回对象的name属性包含目录名,可以获取。 当返回的对象用作上下文管理器时,此名称将指定给 with 语句中的 as 子句的目标(如果有的话)。

例如:

with tempfile.TemporaryDirectory() as f: # 'f' is the 'as' clause in this while statement
    print('Temporary directory is created', f)

调用 cleanup() 方法将明确清除目录。 如果忽略清理错误为真,则显式或隐式清理期间任何未处理的异常都将被忽略。

将使用尽力而为技术销毁任何剩余的可移动项目。

要创建临时目录,我们可以使用以下 Python 程序:

import tempfile

with tempfile.TemporaryDirectory() as f:
    print('Temporary directory is created', f)

输出:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
Temporary directory is created C:\Users\WIN10~1\AppData\Local\Temp\tmp1gk3c5z8

Process finished with exit code 0

本文介绍了使用 Python 中的 tempfile 模块及其子函数创建临时文件的方法。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

Django 返回 JSON

发布时间:2023/05/04 浏览次数:106 分类:Python

在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。

在 Django 中创建对象

发布时间:2023/05/04 浏览次数:59 分类:Python

本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。

在 Django 中为多项选择创建字段

发布时间:2023/05/04 浏览次数:75 分类:Python

在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便