Python基础学习:tempfile模块

编程知识 行业动态 更新时间:2024-06-13 00:21:36

资源代码:Lib/tempfile.py

    该模块用于创建临时文件和目录。它在所有支撑平台上都可以工作。TemporaryFile、NamedTemporaryFile、TemporaryDirectory和SpooledTemporaryFile是提供自动化清理的高级接口,也可用作上下文管理器。mkstemp()和mkdtemp()是低级函数,并且需要手动清理。

    所有的用户可调用的函数和构造器都提供了额外的菜蔬,以允许直接控制临时文件的名称与目录的位置。被该模块使用的文件名包括由随机字符组成的字符串,这种方法使得文件可以被安全的在共享的临时目录中被创建。为了维持向后兼容性,使得参数顺序存在一些奇妙之处;因此为了保证清晰,请使用关键字参数。

    该模块定义了以下用户可调用项:

tempfile. TemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=none, prefix=None, dir=None)

    返回一个file-like object对象,该对象可以被用作为一个临时存储区域。文件被安全的创建,与mkstemp()使用相同的规则。创建的文件会在其被关闭后销毁(包含隐含的关闭情况,即当该对象被当做垃圾回收时)。在Unix下,文件的目录项要么不被创建,要么在文件被创建后立刻销毁。其它平台不支持这个;你的代码不应该依靠一个使用该文件创建的、无论是否包含文件系统中的可见名的临时文件。

    结果对象可以被用作一个上下文管理器。在完成文件对象的上下文或销毁时,临时文件就会被从文件系统中移除。

    参数mode默认为’w+b’,因此被创建的文件可以在未被关闭的情况下进行读和写。使用二进制模式确保了它的行为在所有平台上始终保持一致,无论数据是怎样存储的。buffering、encoding和newline的解释如同open()函数中一样。

    dir、prefix和suffix参数的含义与mkstemp()中的同名参数相同,且默认值一致。

    被返回的对象是一个位于POSIX平台上的真实文件对象。在其它平台上,它是一个类文件对象,且其file属性是一个潜在的真实文件对象。

    os.O_TMPFILE标志可以在其可用且可工作时使用。

 

tempfile. NamedTemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, dir=None, delete=True)

    返回一个类文件对象,该对象可被用做为一个临时存储区域。该文件备被安全的创建,使用与mkstemp()相同的规则。当该文件被关闭时(包括当该对象被当做垃圾回收时的隐含关闭),它将被销毁。在Unix下,文件的目录项要么不被创建,要么一创建就会被销毁。其它平台不支持这种操作;你的代码不应该依靠一格使用该函数创建的临时文件,该文件在文件系统中不确定是否有可见的名称。

    结果对象可以被用作为一个上下文管理器。在完成文件对象的上下文或销毁后,临时文件将会被从文件系统中移除。

    mode参数默认为’w+b’,因此被创建的文件可以在不被关闭的情况下进行读写。二进制模式被使用时,它的行为始终在所有平台上保持一致,不管数据是如何被存储的。buffering、encoding和newline的意义与open()中的一致。

    dir、prefix和suffix参数的意义和默认值与mkstemp()中的一致。

    被返回的对象在POSIX平台上的真实文件对象。在其他平台上,它是一个类文件对象,且它的file属性为潜在的真实文件对象。

    os.0_TMPFILE标志可以被使用,只要他有效且可工作。

 

tempfile. NamedTemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True)

    该函数操作与TemporaryFile()的行为精确相似,除了保证文件在文件系统中有可见的名称(在Unix下,目录整体不连接。)该名称可以从返回的类文件对象的name属性中剥离出来。不论怎样,该名称可以被用作二次打开文件的手段。被命名的临时文件扔被打开,尽管经由不同的平台(Unix可用,Windows NT及以后版本不可用)。如果delte为真(默认值),文件会在其被关闭后被删除。被返回的对象总是一个file属性隐含为真文件对象的类文件对象。类文件对象可以被用在一个with陈述中,就像一个正常文件一样。

 

tempfile. SpooledTemporaryFile(max_size=0, mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)

    该函数的造作精确地类似于TemporaryFile()的行为,除了数据被缠绕在内存上指导文件的大小超过max_size,或者指导文件的fileno()方法被调用,在该点上内容将被写入硬盘并且操作过程类似于TemporaryFile()。

    结果文件拥有一个额外的方法mrollover(),它造成文件翻滚到一个硬盘上的文件,且不顾及它的大小。

    被返回的对象是一个类文件对象,它的_file属性不是一个io.BytesIO或io.StringIO对象(取决于二进制模式或文本模式那个在mode中被明确),就是一个真实的文件对象。至于到底是那个,取决于rollover()被什么调用。类文件对象可以被用于with陈述,就和普通文件一样。

 

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

    该函数安全的创建一个临时文件,其采用与mkdtemp()相同的规则。结果对象可以被用作上下文管理器。在完成上下文或临时文件目录被销毁后,新创建的临时目录及其所有内容将被从文件系统中移除。

    目录名可以倍从被返回的对象的name属性中剥离。当被返回的对象被用作为上下文管理器,name将会被分配给在with陈述中的as从句的目标,仅在唯一指定的情况下。

    目录可以被明确的清理,只需通过调用cleanup()方法。

 

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

    以最安全的方式创建一个临时文件。该文件的创建没有任何竞争条件,且假设平台支持实施os.O_EXCL标志用于os.open()。该文件只对创建它的用户ID开放读写权限。如果平台使用允许位取指示什么文件可以被执行,则该文件可以被任何人执行。文件描述器不可被子进程所继承。

    不同于TemporaryFile(),mkstemp()的使用者是会为其删除临时文件而负责的。

    如果suffix不是None,文件名将会以该suffix而结尾,否则就不会有后缀。mkstemp()不会在文件名与后缀名之间放着分割点;如果你需要这么做,请将分割点初始化在suffix中。

    如果prefix不是None,文件名将会以prfix开始;否则,将会使用默认的prefix。默认情况下,gettempprefix()或gettempprefixb()的返回值是适当的。

    如果dir不是None,文件将被在该目录中创建;否则,默认的目录将被使用。默认的目录从基于平台的列表中被选择,但是用户的应用可以控制目录位置,通过建立TEMDIR、TEMP或TMP环境变量。因此不正保证生成的文件名拥有良好的特性,以至于当它经由os.popen()通过外部命令时,它不会请求队列。

    如果suffix、perfix和dir都不是None,他们必须是同一类型。如果他们是字节,被返回的名称将会用字节取代字符串。如果你想要使用字节返回值有其它默认行为,请通过suffix=b。

    如果text被给出,它按时文件的将以二进制模式或文本模式被打开。在相同的平台上,它的结果无差别。

 

tempfile. mkdtemp(suffix=None,prefix=None,dir=None)

    创建一个临时目录,采用最安全的方式。目录的创建中没有任何金正要求。该目录只可被创建其的用户ID开放读写权限。

    mkdtemp()的使用者必须为对目录的删除操作或内容改写操作负责。

    prefix、suffix和dir参数与mkstemp()中的含义相同。

    mkdtemp()返回新目录的绝对地址名。

 

tempfile. gettempdir()

    返回临时文件所使用目录的目录名。它定义了dir参数在该模块中所有函数内的默认值。

    Python检索一个标准目录列表取找出一个调用者可在其中更顺利创建文件的目录。

该列表为:

1.由环境变量TMPDIR命名的目录;

2.由环境变量TEMP命名的目录;

3.由换将变量TMP命名的目录;

4.一个平台指定的位置:

    在Windows中,目录为C:\TEMP、C:\TMP、\TEMP和\TMP。

    在其它所有平台上,目录为/tmp、/var/tmp和/usr/tmp。

5.当前工作目录为保底存储。

    该搜索的结果将会被缓存,请查看下方tempdir的描述。

 

tempfile. gettempdirb()

    与gettempdir()相似,只不过返回值是字节格式。

 

tempfile. gettempprefix()

    返回用于创建临时文件的文件名前缀。该行为不包含文件组件。

 

tempfile. gettempprefixb()

    与gettempprefixb()相似,但返回值为字节格式。

    该模块使用一个全局变量取存储经gettempdir()返回的用于临时文件的目录的名称。它可以被直接建立区重写选择进城,但是不鼓励这种操作。该模块中的所有函数蚕蛹dir参数,这可以用于明确目录。我们推荐如此使用。

 

tempfile. tempdir

    当建立一个非None的值,该标量定义了dir参数在该模块中所有函数内的默认值。

    如果tempdir为None,在除了gettempprefix()函数外前述所有函数中,它跟随gettempdir()中描述的算法进行初始化。

 

1.示例

    这里有一些tempfile模块的典型适用例程:

>>> import tempfile

 

# create a temporary file and write some data to it

>>> fp = tempfile.TemporaryFile()

>>> fp.write(b'Hello world!')

# read data from file

>>> fp.seek(0)

>>> fp.read()

b'Hello world!'

# close the file, it will be removed

>>> fp.close()

 

# create a temporary file using a context manager

>>> with tempfile.TemporaryFile() as fp:

...     fp.write(b'Hello world!')

...     fp.seek(0)

...     fp.read()

b'Hello world!'

>>>

# file is now closed and removed

 

# create a temporary directory using the context manager

>>> with tempfile.TemporaryDirectory() as tmpdirname:

...     print('created temporary directory', tmpdirname)

>>>

# directory and contents have been removed

 

2.不赞成的函数和变量

    创建临时文件的一种历史方法是首先使用mktemp()函数生成文件名,然后使用此名称创建文件。不幸的是,这种方法不安全,因为不同的进程可以在调用mktemp()后创建文件,但是其余的可能会尝试使用第一个进城继续这个操作,这使得同名文件有被覆盖的危险。解决方法是联合两步,及时创建一个文件。mkstemp()和先前提到的其余函数都使用了这种操作。

 

tempfile. mktemp(suffix=’’, prefix=’tmp’, dir=None)

    返回一个文件的绝对路径名,它在调用生成时不应存在。prefix、suffix和dir参数与mkstemp()中的相似,除了names为字节格式,suffix=None和prefix=None不被支持。

 

警告:使用这些函数可能会给一个程序中引入一些安全漏洞。当你用文件名做任何事情时,其他人可能会攻击你。mktemp()的用法可以被NamedTemporaryFile()轻易取代,仅需通过参数设置delete=False:

>>> f = NamedTemporaryFile(delete=False)
>>> f.name
'/tmp/tmptjujjt'
>>> f.write(b"Hello World!\n")
13
>>> f.close()
>>> os.unlink(f.name)
>>> os.path.exists(f.name)
False

更多推荐

Python基础学习:tempfile模块

本文发布于:2023-03-31 22:56:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/33f33c817633ce19aa08b40132b8c26f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模块   基础   Python   tempfile

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!