Создание временных имен файлов без создания фактического файла в 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')
...
Ответы
Ответ 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.