Python每日一练0032

问题

你须要在程序执行时建立一个临时文件或目录,并但愿使用完以后能够自动销毁掉。html

解决方案

tempfile模块中有不少的函数能够完成这任务。 为了建立一个匿名的临时文件,可使用 tempfile.TemporaryFilepython

from tempfile import TemporaryFile

with TemporaryFile('w+t') as f:
    # Read/write to the file
    f.write('Hello World\n')
    f.write('Testing\n')

    # Seek back to beginning and read the data
    f.seek(0)
    data = f.read()

# Temporary file is destroyed

或者,若是你喜欢,你还能够像这样使用临时文件:安全

f = TemporaryFile('w+t')
# Use the temporary file
...
f.close()
# File is destroyed

TemporaryFile() 的第一个参数是文件模式,一般来说文本模式使用 w+t ,二进制模式使用 w+b 。 这个模式同时支持读和写操做,在这里是颇有用的,由于当你关闭文件去改变模式的时候,文件实际上已经不存在了。 TemporaryFile() 另外还支持跟内置的 open() 函数同样的参数。好比:微信

with TemporaryFile('w+t', encoding='utf-8', errors='ignore') as f:
    ...

在大多数Unix系统上,经过 TemporaryFile() 建立的文件都是匿名的,甚至连目录都没有。 若是你想打破这个限制,可使用 NamedTemporaryFile() 来代替。好比:函数

from tempfile import NamedTemporaryFile

with NamedTemporaryFile('w+t') as f:
    print('filename is:', f.name)
    ...

# File automatically destroyed

这里,被打开文件的 f.name 属性包含了该临时文件的文件名。 当你须要将文件名传递给其余代码来打开这个文件的时候,这个就颇有用了。 和 TemporaryFile() 同样,结果文件关闭时会被自动删除掉。 若是你不想这么作,能够传递一个关键字参数 delete=False 便可。好比:spa

with NamedTemporaryFile('w+t', delete=False) as f:
    print('filename is:', f.name)
    ...

为了建立一个临时目录,可使用 tempfile.TemporaryDirectory() 。好比:code

from tempfile import TemporaryDirectory

with TemporaryDirectory() as dirname:
    print('dirname is:', dirname)
    # Use the directory
    ...
# Directory and all contents destroyed

讨论

TemporaryFile()NamedTemporaryFile()TemporaryDirectory() 函数 应该是处理临时文件目录的最简单的方式了,由于它们会自动处理全部的建立和清理步骤。 在一个更低的级别,你可使用 mkstemp()mkdtemp() 来建立临时文件和目录。好比:htm

>>> import tempfile
>>> tempfile.mkstemp()
(3, '/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-/tmp7fefhv')
>>> tempfile.mkdtemp()
'/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-/tmp5wvcv6'
>>>

可是,这些函数并不会作进一步的管理了。 例如,函数 mkstemp() 仅仅就返回一个原始的OS文件描述符,你须要本身将它转换为一个真正的文件对象。 一样你还须要本身清理这些文件。对象

一般来说,临时文件在系统默认的位置被建立,好比 /var/tmp 或相似的地方。 为了获取真实的位置,可使用 tempfile.gettempdir() 函数。好比:utf-8

>>> tempfile.gettempdir()
'/var/folders/7W/7WZl5sfZEF0pljrEB1UMWE+++TI/-Tmp-'
>>>

全部和临时文件相关的函数都容许你经过使用关键字参数 prefixsuffixdir 来自定义目录以及命名规则。好比:

>>> f = NamedTemporaryFile(prefix='mytemp', suffix='.txt', dir='/tmp')
>>> f.name
'/tmp/mytemp8ee899.txt'
>>>

最后还有一点,尽量以最安全的方式使用 tempfile 模块来建立临时文件。 包括仅给当前用户受权访问以及在文件建立过程当中采起措施避免竞态条件。 要注意的是不一样的平台可能会不同。所以你最好阅读 官方文档 来了解更多的细节。

来源

Python Cookbook

关注

欢迎关注个人微信公众号:python每日一练

相关文章
相关标签/搜索