如何在Python中使用自定义名称创建NamedTemporaryFile?

时间:2019-08-14 11:31:31

标签: python-3.x

我需要使用自定义名称创建NamedTemporaryFile。

我尝试设置name属性,但是没有用。

from tempfile import NamedTemporaryFile

f = NamedTemporaryFile(dir='/tmp/')
f.name = custom_name

当我尝试使用os.path.exists时,文件名没有更改,旧名称返回true。

我已经查看过temp files/directories with custom names?,但是创建临时目录不适合我的用例。

1 个答案:

答案 0 :(得分:0)

NamedTemporaryFile 没有 name 参数。名称由 tempfile._get_candidate_names 生成。可以修补它并提供您自己的名字。但是,您可以为生成的名称添加前缀和后缀,至少使名称的一部分可预测:

Python 3.6.9 (default, Nov 23 2019, 06:49:55) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from tempfile import NamedTemporaryFile                                                                                                                                                                                     

In [2]: file = NamedTemporaryFile(prefix='asdf_', mode='w+', suffix='.xlsx')                                                                                                                                                        

In [3]: file.name                                                                                                                                                                                                                   
Out[3]: '/tmp/asdf_uskygtov.xlsx'

这是猴子补丁的示例:

Python 3.6.9 (default, Nov 23 2019, 06:49:55) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import tempfile                                                                                                                                                                                                             

In [2]: import itertools                                                                                                                                                                                                            

In [3]: tempfile._get_candidate_names = lambda: itertools.repeat('my_file')                                                                                                                                                         

In [4]: file = tempfile.NamedTemporaryFile(mode='w+', prefix='', suffix='txt')                                                                                                                                                      

In [5]: file.name                                                                                                                                                                                                                   
Out[5]: '/tmp/my_filetxt'

In [6]: file = tempfile.NamedTemporaryFile(mode='w+', prefix='', suffix='.txt')                                                                                                                                                     

In [7]: file.name                                                                                                                                                                                                                   
Out[7]: '/tmp/my_file.txt'