>>> from env_helper import info; info()
页面更新时间: 2023-12-29 20:21:36
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-16-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

9.5. Python 临时文件(夹)模块 tempfile 学习

应用程序经常要保存一些临时的信息,这些信息不是特别重要,没有必要写在配置文件里,但又不能没有,这时候就可以把这些信息写到临时文件里。 其实很多程序在运行的时候,都会产生一大堆临时文件,有些用于保存日志,有些用于保存一些临时数据,还有一些保存一些无关紧要的设置。 在windows操作系统中,临时文件一般被保存在这个文件夹下: C:/Documents and Settings/User/Local Settings/Temp 。 其实我们最常用的IE浏览器在浏览网页的时候,会产生大量的临时文件,这些临时文件一般是我们浏览过的网页的本地副本。

Python提供了一个 tempfile 模块,用来对临时数据进行操作。

mkstemp() 方法用于创建一个临时文件。该方法仅仅用于创建临时文件,调用 tempfile.mkstemp() 函数后, 返回包含两个元素的元组,第一个元素指示操作该临时文件的安全级别,第二个元素指示该临时文件的路径。 参数 suffixprefix 分别表示临时文件名称的后缀和前缀; dir 指定了临时文件所在的目录,如果没有指定目录,将根据系统环境变量 TMPDIR , TEMP 或者 TMP 的设置来保存临时文件; 参数 text 指定了是否以文本的形式来操作文件,默认为 False ,表示以二进制的形式来操作文件。

tempfile.mkstemp([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]])

该函数用于创建一个临时文件夹。参数的意思与 tempfile.mkdtemp 一样。它返回临时文件夹的绝对路径。

tempfile.mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]])

mktemp() 用于返回一个临时文件的路径,但并不创建该临时文件。

tempfile.mktemp([suffix=''[, prefix='tmp'[, dir=None]]])

该属性用于指定创建的临时文件(夹)所在的默认文件夹。 如果没有设置该属性或者将其设为 None , Python将返回以下环境变量 TMPDIR , TEMP , TEMP 指定的目录, 如果没有定义这些环境变量,临时文件将被创建在当前工作目录。

tempfile.tempdir

gettempdir() 则用于返回保存临时文件的文件夹路径。

tempfile.gettempdir()

TemporaryFile() 函数返回一个类文件 对象(file-like)用于临时数据保存(实际上对应磁盘上的一个临时文件)。 当文件对象被 close 或者被 del 的时候,临时文件将从磁盘上删除。 modebufsize 参数的单方与 open() 函数一样; suffixprefix 指定了临时文件名的后缀和前缀; dir 用于设置临时文件默认的保存路径。 返回的类文件对象有一个 file 属性,它指向真正操作的底层的 file 对象。

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])

tempfile.NamedTemporaryFile 函数的行为与 tempfile.TemporaryFile 类似, 只不过它多了一个 delete 参数,用于指定类文件对象 close 或者被 del 之后, 是否也一同删除磁盘上的临时文件(当 delete = True 的时候,行为与 TemporaryFile 一样)。

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

tempfile.SpooledTemporaryFile 函数的行为与 tempfile.TemporaryFile 类似。 不同的是向类文件对象写数据的时候,数据长度只有到达参数 max_size 指定大小时, 或者调用类文件对象的 fileno() 方法,数据才会真正写入到磁盘的临时文件中。

tempfile.SpooledTemporaryFile([max_size=0[, mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]])

9.5.1. 使用 TemporaryFile

如何你的应用程序需要一个临时文件来存储数据,但不需要同其他程序共享, 那么用 TemporaryFile 函数创建临时文件是最好的选择。 其他的应用程序是无法找到或打开这个文件的,因为它并没有引用文件系统表。 用这个函数创建的临时文件,关闭后会自动删除。

>>> import os
>>> import tempfile
>>>
>>> print ('Building a file name yourself:')
>>> filename = '/tmp/guess_my_name.%s.txt' % os.getpid()
>>> temp = open(filename, 'w+b')
>>> try:
>>>     print ( 'temp:', temp)
>>>     print ('temp.name:', temp.name)
>>> finally:
>>>     temp.close()
>>>     os.remove(filename)     # Clean up the temporary file yourself
>>>
>>> print ('TemporaryFile:')
>>> temp = tempfile.TemporaryFile()
>>> try:
>>>     print( 'temp:', temp)
>>>     print ('temp.name:', temp.name)
>>> finally:
>>>     temp.close()# Automatically cleans up the file
Building a file name yourself:
temp: <_io.BufferedRandom name='/tmp/guess_my_name.12979.txt'>
temp.name: /tmp/guess_my_name.12979.txt
TemporaryFile:
temp: <_io.BufferedRandom name=60>
temp.name: 60

这个例子说明了普通创建文件的方法与 TemporaryFile() 的不同之处, 注意:用 TemporaryFile() 创建的文件没有文件名。

默认情况下使用 w+b 权限创建文件,在任何平台中都是如此,并且程序可以对它进行读写。

>>> import os
>>> import tempfile
>>>
>>> temp = tempfile.TemporaryFile()
>>> try:
>>>     temp.write('Some data'.encode())
>>>     temp.seek(0)
>>>
>>>     print (temp.read())
>>> finally:
>>>     temp.close()
>>>
>>>
b'Some data'

写入后,需要使用 seek() ,为了以后读取数据。

如果你想让文件以text模式运行,那么在创建的时候要修改mode为 'w+t'

>>> import tempfile
>>> f = tempfile.TemporaryFile(mode='w+t')
>>> try:
>>>     f.writelines(['first\n', 'second\n'])
>>>     f.seek(0)
>>>     for line in f:
>>>         print (line.rstrip())
>>> finally:
>>>     f.close()
first
second

9.5.2. 使用命名临时文件

如果临时文件会被多个进程或主机使用,那么建立一个有名字的文件是最简单的方法。 这就是 NamedTemporaryFile 要做的,可以使用 name 属性访问它的名字。

>>> import os
>>> import tempfile
>>>
>>> temp = tempfile.NamedTemporaryFile()
>>> try:
>>>     print ( 'temp:', temp)
>>>     print ('temp.name:', temp.name)
>>> finally:
>>>     # Automatically cleans up the file
>>>     temp.close()
>>> print ('Exists after close:', os.path.exists(temp.name))
temp: <tempfile._TemporaryFileWrapper object at 0x7f0d72721e10>
temp.name: /tmp/tmprolmzfwn
Exists after close: False

尽管文件带有名字,但它仍然会在 close 后自动删除。

Predicting Names 用3个参数来控制文件名,名字产生公式: dir + prefix + random + suffix

>>> import tempfile
>>>
>>> temp = tempfile.NamedTemporaryFile(suffix='_suffix',
>>>                                    prefix='prefix_',
>>>                                    dir='/tmp',
>>>                                    )
>>> try:
>>>     print ('temp:', temp)
>>>     print ('temp.name:', temp.name)
>>> finally:
>>>     temp.close()
temp: <tempfile._TemporaryFileWrapper object at 0x7f0d71879b90>
temp.name: /tmp/prefix_hjkco438_suffix

9.5.3. 使用临时目录 tempfile.mkdtemp

创建临时目录,这个不多说,直接看例子

>>> import os
>>> import tempfile
>>>
>>> directory_name = tempfile.mkdtemp()
>>> print ( directory_name)
>>> # Clean up the directory yourself
>>> os.removedirs(directory_name)
/tmp/tmpqja9vdw0

目录需要手动删除。