Вопрос номер 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')
...
NamedTemporaryFile
гарантирует уникальное имя (возможно), попробовав его и повторив, если оно существует. Получение только имени не гарантирует, что вы действительно сможете создать файл позже, вы открываете состояние гонки, в котором кто-то другой использует то же имя до вас.Ответы:
Если вам нужно только имя временного файла, вы можете вызвать внутреннюю функцию временного файла
_get_candidate_names()
:Повторный вызов
next
вернет другое имя и т. Д. Это не дает вам путь к временной папке. Чтобы получить каталог tmp по умолчанию, используйте:источник
temp_dir = tempfile.mkdtemp(prefix='some-prefix_')
это безопасно создать временный каталог и вернуть строку с абсолютным путем.next(tempfile._get_candidate_names())
это не обязательно возвращает несуществующий путь, поэтому интерфейсыtempfile.gettempdir()
вместо частногоtempfile._get_default_tempdir()
.tempfile.mkdtemp
пользователь несет ответственность за удаление временного каталога и его содержимого по завершении работы с ним.Я думаю, что самый простой и безопасный способ сделать это примерно так:
Создается временный каталог, доступ к которому есть только у вас, поэтому проблем с безопасностью быть не должно, но в нем не будут создаваться файлы, поэтому вы можете просто выбрать любое имя файла, которое хотите создать в этом каталоге.
edit: в Python 3 теперь вы можете использовать
tempfile.TemporaryDirectory()
в качестве диспетчера контекста удаление за вас:источник
tempfile.mkdtemp
что пользователь несет ответственность за удаление временного каталога и его содержимого по завершении работы с ним.tempfile.TemporaryDirectory()
в качестве диспетчера контекста, он будет удален для вас.Может быть, немного поздно, но что-то не так?
источник
without creating actual file in Python
.tempfile.mktemp()
сделай это.Но учтите, что это устарело. Однако он не создаст файл, и это общедоступная функция в временном файле по сравнению с использованием
_get_candidate_names()
.Причина, по которой он устарел, связана с промежутком времени между вызовом этого и фактической попыткой создания файла. Однако в моем случае вероятность этого очень мала, и даже в случае неудачи это было бы приемлемо. Но вы должны оценить свой вариант использования.
источник
tempfile.mktemp
документацию). Так что это не следует считать приемлемым.os.path.join(tempfile.mkdtemp(), 'something')
Там, по крайней мере, каталог создан (и, как я полагаю, принадлежит вам).Объединив предыдущие ответы, мое решение:
Сделайте
some_id
необязательным, если он вам не нужен.источник
_get_candidate_names()
он не существует, по умолчанию можно использовать какой-нибудь полуслучайный генератор строк. Например какой-то uuid.Как сказал Йоахим Исакссон в комментариях, если вы просто получите имя, у вас могут возникнуть проблемы, если какая-то другая программа будет использовать это имя раньше, чем ваша программа. Шансы невелики, но не исключены.
Поэтому в этой ситуации безопаснее всего использовать полный конструктор GzipFile (), который имеет подпись
GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
. Таким образом, вы можете передать ему открытый fileobj, а также имя файла, если хотите. Подробности смотрите в документации по gzip.источник