La pregunta, número 10501247 , en stackoverflow da respuesta a cómo crear un archivo temporal en Python.
Solo necesito tener un nombre de archivo temporal en mi caso.
Llamar a tempfile.NamedTemporaryFile () devuelve el identificador de archivo después de la creación del archivo real.
¿Hay forma de obtener solo el nombre del archivo?
# 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')
...
python
temporary-files
colina
fuente
fuente
NamedTemporaryFile
garantiza un nombre único, (probablemente) probándolo y volviendo a intentarlo si existe. Obtener solo un nombre no garantizará que realmente pueda crear el archivo más tarde, se está abriendo a la condición de carrera de otra persona que usa el mismo nombre antes que usted.Respuestas:
Si solo desea un nombre de archivo temporal, puede llamar a la función interna de archivo temporal
_get_candidate_names()
:Llamar de
next
nuevo, devolverá otro nombre, etc. Esto no le da la ruta a la carpeta temporal. Para obtener el directorio 'tmp' predeterminado, use:fuente
temp_dir = tempfile.mkdtemp(prefix='some-prefix_')
crear de forma segura un directorio temporal y devolver una cadena con la ruta absoluta.next(tempfile._get_candidate_names())
no necesariamente devuelve una ruta inexistente, es por eso que las interfaces de archivos temporales a nivel de usuario pueden probar varios nombres hasta que se encuentre uno sin usar :tempfile.gettempdir()
lugar de privadotempfile._get_default_tempdir()
.tempfile.mkdtemp
el usuario es el responsable de eliminar el directorio temporal y su contenido cuando termina con él.Creo que la forma más fácil y segura de hacer esto es algo como:
Se crea un directorio temporal al que solo usted puede acceder, por lo que no debería haber problemas de seguridad, pero no se crearán archivos en él, por lo que puede elegir cualquier nombre de archivo que desee crear en ese directorio.
editar: en Python 3 ahora puede usarlo
tempfile.TemporaryDirectory()
como administrador de contexto para manejar la eliminación por usted:fuente
tempfile.mkdtemp
el usuario es responsable de eliminar el directorio temporal y su contenido cuando termina con él.tempfile.TemporaryDirectory()
como administrador de contexto, se eliminará.Puede que sea un poco tarde, pero ¿hay algo de malo en esto?
fuente
without creating actual file in Python
.tempfile.mktemp()
hacer esto.Pero tenga en cuenta que está en desuso. Sin embargo, no creará el archivo y es una función pública en tempfile en comparación con el uso de
_get_candidate_names()
.La razón por la que está en desuso se debe a la brecha de tiempo entre llamar a esto y realmente intentar crear el archivo. Sin embargo, en mi caso, la posibilidad de eso es muy pequeña e incluso si fallara, sería aceptable. Pero depende de usted evaluar su caso de uso.
fuente
tempfile.mktemp
documentación). Entonces eso no debería considerarse aceptable.os.path.join(tempfile.mkdtemp(), 'something')
Allí, al menos, se crea el directorio (y es de tu propiedad, supongo).Combinando las respuestas anteriores, mi solución es:
Haga
some_id
opcional si no es necesario para usted.fuente
_get_candidate_names()
no existe, se puede utilizar por defecto algún generador de cadenas semi-aleatorio. Por ejemplo, algunos uuid.Como dijo Joachim Isaksson en los comentarios, si solo obtiene un nombre, puede tener problemas si algún otro programa usa ese nombre antes que su programa. Las posibilidades son escasas, pero no imposibles.
Entonces, lo más seguro en esta situación es usar el constructor GzipFile () completo, que tiene la firma
GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
. Entonces puede pasarle el fileobj abierto, y también un nombre de archivo, si lo desea. Consulte los documentos de gzip para obtener más detalles.fuente