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')
...
答案 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)
但请注意,它已被弃用。但是,与使用_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)
优于其他答案:
_
开头的函数)