小门板儿

Menu

Python tempfile模块:生成临时文件和临时目录

一、tempfile模块简介

1、tempfile模块应用场景

Python的tempfile模块是用来创建临时文件或者文件夹的跨平台工具。在大型数据处理项目中,有的处理结果是不需要向用户最终展示的,但是它们的应用又是贯穿项目始终的,在这种情况下,我们就需要使用tempfile模块来解决这种问题。

2、tempfile模块的方法

tempfile模块主要包括三类函数:

(1)四个高级接口:TemporaryFileNamedTemporaryFileSpooledTemporaryFileTemporaryDirectory,这四个高级接口提供了自动清除功能并且可以作为上下文管理器使用。

函数名描述
TemporaryFileNamedTemporaryFile高级临时文件对象创建函数
SpooledTemporaryFile假脱机模式高级临时文件对象创建函数
TemporaryDirectory高级临时目录创建函数

(2)另外,两个底层函数mkstemp()mkdtemp(),用于生成临时底层的临时文件和文件夹,在使用完它们的时候需要手动清除。

函数名描述
mkstemp()底层临时文件创建函数
mkdtemp()底层临时目录创建函数

(3)最后,tempfile模块还有一些针对文件、文件夹属性的操作函数gettempdir()、gettempdirb()、gettempprefix、gettempprefixb。

函数名描述
gettempdir()以文本格式返回临时文件夹名函数
gettempdirb()以二进制格式返回临时文件夹名函数
gettempprefix以文本格式返回临时文件名前缀
gettempprefixb以二进制格式返回临时文件名前缀

tempfile的所有用户可调用函数和构造函数都带有额外参数,通过这些参数可以实现对临时文件目录和位置的管理。此模块会在共享临时目录中安全地创建临时文件,并给创建临时文随机起个名。

二、tempfile模块主要函数介绍

2.1 高级临时文件对象创建函数:Temporaryfile和NamedTemporaryFile

Temporaryfile函数返回一个类文件对象用作临时存储区,它使用与mkstemp()函数相同规则的安全重建文件模式,它一关闭就会被销毁(包括针对垃圾收集对象的隐式关闭)。需要注意的是,在Unix系统环境,文件的目录要么根本不创建,要么在文件创建后立即删除。也就是说,代码不会依赖于此函数创建的临时文件,包括它们的名称,这也是这个函数与NamedTemporaryfile函数的不同之处。

TemporaryFile函数的调用格式为:

TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, *, error=None)

函数参数选项: (1)mode参数:默认为w+r,以便文件在被创建时可以执行读写操作。 (2)buffering、encoding、errors和newline参数:用于解释open()函数行为。 (3) dir、prefix和suffix参数:与mkstemp()具有相同的含义和默认设置。

示例:

import tempfile

# 下面创建一个临时文件并写入一些数据
fp = tempfile.TemporaryFile()
fp.write(b'Hello Xiaoliang!')

# 读取数据
fp.seek(0)## 把文件指针设置到文件的开头位置
print(fp.read())

fp.seek(0)# 把文件指针设置到文件的开头位置

另外,该函数生成的对象可以用作上下文管理器。完成上下文管理或销毁文件对象后,临时文件将从文件系统中删除。

import tempfile

with tempfile.TemporaryFile() as fp:
fp.write(b'Hello Xiaoliang!')
fp.seek(0)
fp.read()

2、NamedTemporaryfile函数

除了NamedTemporaryfile()函数实现了在文件系统中只有一个可见名之外,其作用与TemporaryFile()功能完全相同。执行完该函数后,我们可以从返回的类文件对象的name属性中检索文件名称。在Unix系统上,在命名的临时文件处于打开状态时,可以使用该名称打开生成的文件。

NamedTemporaryFile函数的调用格式与TemporaryFile函数的非常相似,唯一不同的是具有了一个delete参数:

NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
newline=None, suffix=None, prefix=None, dir=Nonde, delete=True,
*, error=None)

delete参数选项:如果该参数为True(默认),则文件一关闭则被删除。返回的对象始终是一个类文件对象,其文件属性是底层的真实文件对象。也就是说,这个类文件对象可以在with上下文管理中使用,就像普通文件一样。

import tempfile

# 创建一个具有自定义属性的临时文件,文件名前缀为"temp_", 文件模式为"w+"
temp_file = tempfile.NamedTemporaryFile(prefix="temp_", mode="w+",delete=False)

# 打印临时文件的名称
print("临时文件名:", temp_file.name)
# 向临时文件中写入数据
temp_file.write("Hello, World!")
temp_file.seek(0)  # 将文件指针移动到文件开头
# 从临时文件中读取数据
data = temp_file.read()
print("读取到的数据:", data)
# 关闭临时文件
temp_file.close()

2.2 假脱机模式高级临时文件对象创建函数:SpooledTemporaryfile

SpooledTemporaryFile()函数除了数据会在内存中进行假脱机外,与TemporaryFile()完全相同。直到文件大小超过max_size或直到调用文件的fileno()方法,此时使用与TemporaryFile()一样的操作,将内容写入磁盘。

python将命令输出写入文件

import tempfile
def write_temp():
   temp = tempfile.SpooledTemporaryFile(max_size=1024 * 10)
   out_temp = temp.fileno()
   command = "ifconfig"
   p = subprocess.Popen(command, shell=True, stdout=out_temp, \
       bufsize=1, universal_newlines=True)
   print(p.pid)
   print(out_temp.conjugate())

2.3 高级临时目录创建函数:TemporaryDirectory

TemporaryDirectory函数使用与mkdtemp()相同的规则安全地创建临时目录。生成的对象可以用作上下文管理器(这里给出示例)。完成上下文或销毁临时目录对象后,新创建的临时目录及其所有内容将从文件系统中删除。其调用格式如下所示:

TemporaryDirectory(suffix=None, prefix=None, dir=None)

调用该函数后,创建的目录名可以从返回对象的name属性中检索到。当返回的对象作为上下文管理器时,该名称将被分配给with语句中as子句的目标。另外,可以通过调用cleanup()方法显式清理目标。

import tempfile
temp_dir=tempfile.TemporaryDirectory(prefix="aaaaaa_")
print(temp_dir.name)
temp_dir.cleanup()

2.4 底层临时文件/目录创建函数:mkstemp和mkdtemp

1、底层临时文件创建函数mkstemp()

mkstemp()函数以尽可能安全的方式创建临时文件,与TemporaryFile()函数不同,用户需要负责临时文件的删除。其调用格式如下所示:

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

函数参数选项: (1)suffix:文件后缀,默认为None。如果不是None,文件名将以设置的后缀结尾。注意,mkstemp()函数不会在文件名和后缀之间加一个点,如果需要可以自行添加。 (2)prefix:文件前缀,默认为None。如果不是None,文件以该前缀为开头;否则使用默认前缀,默认的前缀是由gettempprefix()或gettempprefixb()的返回值确定。 (3)dir:文件创建的目录,默认为None,如果不是None,则使用默认目录;默认目录是从所使用的系统列表中选择的,但是用户可以通过设置TMPDIR、TEMP或TMP环境变量来控制目录位置。 (4)text:文本类型,默认为False,即以二进制模式打开。如果为true,则以文本格式打开。

mkstemp()返回一个元组,该元组包含一个用于打开文件的操作系统级别(OS-leve)句柄(有os.open()函数返回)和该文件绝对路径名。

import tempfile
handle,path=tempfile.mkstemp()
print(path)

with open(path,'a') as p:
   p.write('22222222')

with os.fdopen(handle,"a") as f:
   f.write('3333333')

with open(path,'r') as p:
   print(p.read())

2、底层临时目录创建函数mkdtemp() mkdtemp()函数以尽可能安全的方式创建临时目录。只有通过用户ID才能读取、写入和搜索目录,同时用户负责删除临时目录及其内容。其调用格式和参数与mkstemp()相同。注意,mkdtemp()函数只返回新建目录的绝对路径。

三、tempfile模块的文件/文件夹属性操作函数

1、返回临时文件夹名函数:gettempdir和gettempdirb

gettempdir()返回存放临时文件的文件夹名字,该函数的返回值是tempfile内的全局变量,也就是说,gettempdir()返回的文件夹名将作为tempfile模块中的所有函数dir参数的默认值。

import tempfile

print(tempfile.gettempdir())
print(tempfile.gettempdirb())

Python内部搜索一个标准目录列表,用户可以在其中创建文件的目录: (1)由TMPDIR环境变量命名的目录; (2)由TEMP环境变量命名的目录; (3)由TMP环境变量命名的目录。 (4)不同平台特定的位置:Windows系统,目录为:C:\TEMP, C:\TMP, \TEMP, and \TMP;其他系统,目录为:/tmp, /var/tmp, and /usr/tmp。 (5)当前工作目录。 另外,还有一个与gettempdir()作用相同,只是返回的格式二进制的函数gettempdirb()

2、返回临时文件前缀函数:gettempprefix和gettempprefix gettempprefix以文本格式返回创建的临时文件的前缀;gettempprefixb以二进制格式返回创建的临时文件的前缀。

print(tempfile.gettempprefix())
print(tempfile.gettempprefixb())

原文链接:https://blog.csdn.net/weixin_37926734/article/details/123563067

— 于 共写了4931个字
— 标签:

评论已关闭。