生成临时文件名而无需在Python中创建实际文件

时间:2014-10-24 04:19:59

标签: python temporary-files

stackoverflow中的问题number 10501247给出了如何在Python中创建临时文件的答案 在我的情况下,我只需要有临时文件名 调用tempfile.NamedTemporaryFile()会在实际创建文件后返回文件句柄 有办法只获取文件名吗?

# Trying to get temp file path
tf = tempfile.NamedTemporaryFile()
temp_file_name = tf.name
tf.close()
# Here is my real purpose to get the temp_file_name
f = gzip.open(temp_file_name ,'wb')
...

7 个答案:

答案 0 :(得分:49)

如果只想要临时文件名,可以调用内部临时文件函数_get_candidate_names()

import tempfile

temp_name = next(tempfile._get_candidate_names())
% e.g. px9cp65s

再次调用next,将返回另一个名称等。这不会为您提供临时文件夹的路径。要获取默认的'tmp'目录,请使用:

defult_tmp_dir = tempfile._get_default_tempdir()
% results in: /tmp 

答案 1 :(得分:26)

我认为最简单,最安全的方法就是:

path = os.path.join(tempfile.mkdtemp(), 'something')

创建一个只有您可以访问的临时目录,因此不存在安全问题,但不会在其中创建任何文件,因此您只需选择要在该目录中创建的任何文件名。

答案 2 :(得分:12)

可能有点晚了,但这有什么不妥吗?

import tempfile
with tempfile.NamedTemporaryFile(dir='/tmp', delete=False) as tmpfile:
    temp_file_name = tmpfile.name
f = gzip.open(temp_file_name ,'wb')

答案 3 :(得分:6)

tempfile.mktemp()这样做。

但请注意,它已被弃用。但是,与使用_get_candidate_names()相比,它将创建文件,并且它是tempfile中的公共函数。

它被弃用的原因是由于调用它和实际尝试创建文件之间的时间间隔。然而在我的情况下,这种情况的可能性非常小,即使它会失败也是可以接受的。但是由你来评估你的用例。

答案 4 :(得分:4)

正如Joachim Isaksson在评论中所说,如果你只是得到一个名字,如果其他程序碰巧在你的程序之前使用该名称,你可能会遇到问题。机会很小,但并非不可能。

因此,在这种情况下安全的做法是使用完整的GzipFile()构造函数,该构造函数具有签名GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])。所以如果你愿意,你可以传递open fileobj和文件名。有关详细信息,请参阅gzip文档。

答案 5 :(得分:4)

结合前面的答案,我的解决方法是:

def get_tempfile_name(some_id):
    return os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + "_" + some_id)

如果您不需要some_id,则可以选择。

答案 6 :(得分:0)

我会这样做:

import tempfile
import os.path
import random
import string

def generate_temp_filename() -> str:
    random_string = ''.join(random.choices(string.ascii_uppercase + string.digits, k=10))
    return os.path.join(tempfile.gettempdir(), random_string)

优于其他答案:

  • 不依赖私有函数(以 _ 开头的函数)
  • 不创建文件或目录
  • 不使用已弃用的函数