Подтвердить что ты не робот

Создание временных имен файлов без создания фактического файла в Python

Вопрос, номер 10501247, в stackoverflow дает ответ, как создать временный файл в 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')
...
4b9b3361

Ответ 1

Если вы хотите только имя файла temp, вы можете вызвать функцию внутреннего tempfile _get_candidate_names():

import tempfile

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

Вызов next снова, вернет другое имя и т.д. Это не даст вам путь к папке temp. Чтобы получить каталог "tmp" по умолчанию, используйте:

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

Ответ 2

Возможно, немного поздно, но что-то не так с этим?

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

Ответ 3

tempfile.mktemp() сделать это.

Но учтите, что он устарел. Однако он будет не создавать файл и является общедоступной функцией в tempfile по сравнению с использованием _get_candidate_names().

Причина, по которой она устарела, связана с разницей времени между вызовом этого и фактически попыткой создания файла. Однако в моем случае вероятность того, что это настолько тонкая, и даже если она потерпит неудачу, будет приемлемой. Но это зависит от вас, чтобы оценить ваши возможности.

Ответ 4

Я думаю, что самый простой и безопасный способ сделать это:

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

Создается временная директория, доступ к которой вы можете получить, поэтому проблем с безопасностью не должно быть, но в ней не будет файлов, поэтому вы можете просто выбрать любое имя файла, которое вы хотите создать в этом каталоге.

Ответ 5

Как сказал Joachim Isaksson в комментариях, если вы просто получите имя, у вас могут возникнуть проблемы, если какая-либо другая программа использует это имя до того, как ваша программа сделает это. Шансы небольшие, но не невозможные.

Таким образом, безопасная вещь в этой ситуации - использовать полный конструктор GzipFile(), который имеет подпись GzipFile( [filename[, mode[, compresslevel[, fileobj]]]]). Таким образом, вы можете передать ему файл openobj и имя файла, если хотите. Подробнее см. В документах gzip.