生成临时文件名,而不用在Python中创build实际文件
在stackoverflow的问题, 编号10501247给出答案如何在Python中创build临时文件。
我只需要在我的情况下有临时文件名。
调用tempfile.NamedTemporaryFile()会在创build实际文件后返回文件句柄。
有没有办法只获取文件名?
# 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') ...
如果你只想要一个临时文件名,你可以调用内部tempfile函数_get_candidate_names()
:
import tempfile temp_name = next(tempfile._get_candidate_names()) % eg px9cp65s
再次调用,将返回另一个名称,等等。这不会给你临时文件夹的path。 要获得默认的“tmp”目录,请使用:
defult_tmp_dir = tempfile._get_default_tempdir() % results in: /tmp
可能有点晚,但是这有什么问题吗?
import tempfile with tempfile.NamedTemporaryFile(dir='/tmp', delete=False) as tmpfile: temp_file_name = tmpfile.name f = gzip.open(temp_file_name ,'wb')
tempfile.mktemp()
这样做。
但请注意,它已被弃用。 但是它不会创build文件,而且它是使用_get_candidate_names()
方法的临时文件中的一个公共函数。
它被弃用的原因是由于调用它和实际尝试创build文件之间的时间差。 但是就我而言,这个机会是非常渺茫的,即使它会失败也是可以接受的。 但是,你要评估你的用例。
正如约阿希姆·伊萨克松(Joachim Isaksson)在评论中所说的那样,如果你刚刚得到一个名字,那么如果其他程序恰好在你的程序之前使用这个名字的话,你可能会遇到问题 机会很渺茫,但不是不可能的。
所以在这种情况下安全的做法是使用完整的GzipFile()构造函数,该构造函数具有签名GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
。 所以你可以通过它打开fileobj,以及一个文件名,如果你喜欢。 有关详细信息,请参阅gzip文档。
我认为最简单,最安全的做法是这样的:
path = os.path.join(tempfile.mkdtemp(), 'something')
创build一个只有你可以访问的临时目录,所以应该没有安全问题,但是不会有任何文件被创build,所以你可以select你想在该目录下创build的文件名。
- 嘲笑一个函数来引发Exception来testing一个except块
- 所有包含的字符集,以避免“java.nio.charset.MalformedInputException:input长度= 1”?