当前位置 博文首页 > jcLee95的博客:Python编程基础 - 使用临时文件和临时目录

    jcLee95的博客:Python编程基础 - 使用临时文件和临时目录

    作者:[db:作者] 时间:2021-09-18 15:54

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

    李俊才
    CSDN博客:jcLee1995
    291148484@163.com


    【导读】:本文先介绍了什么是临时文件,然后围绕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(),可以忽略文件大小,让文件立即写入磁盘。

    cs
    下一篇:没有了