python - namedtemporaryfile - tempfile ruby
Genere nombres de archivos temporales sin crear archivos reales en Python (6)
Combinando las respuestas anteriores, mi solución es:
def get_tempfile_name(some_id):
return os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + "_" + some_id)
Haga some_id
opcional si no es necesario para usted.
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.
Al llamar a tempfile.NamedTemporaryFile () se devuelve el identificador de archivo después de la creación del archivo real.
¿Hay manera de obtener el nombre del archivo solamente?
# 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'')
...
Como Joachim Isaksson dijo en los comentarios, si obtiene un nombre, puede tener problemas si algún otro programa usa ese nombre antes de que lo haga su programa. Las posibilidades son escasas, pero no imposibles.
Entonces, lo más seguro que se puede hacer en esta situación es usar el constructor GzipFile () completo, que tiene la firma GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
. Así que puedes pasarle el archivo abierto, y también un nombre de archivo, si lo deseas. Ver los documentos gzip para más detalles.
Creo que la forma más fácil y segura de hacer esto es algo como:
path = os.path.join(tempfile.mkdtemp(), ''something'')
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, así que simplemente puede seleccionar cualquier nombre de archivo que desee crear en ese directorio.
Puede que sea un poco tarde, pero ¿hay algún problema con esto?
import tempfile
with tempfile.NamedTemporaryFile(dir=''/tmp'', delete=False) as tmpfile:
temp_file_name = tmpfile.name
f = gzip.open(temp_file_name ,''wb'')
Si solo desea un nombre de archivo temporal, puede llamar a la función de archivo temporal interno _get_candidate_names()
:
import tempfile
temp_name = next(tempfile._get_candidate_names())
% e.g. px9cp65s
Si vuelve a llamar de nuevo, devolverá otro nombre, etc. Esto no le da la ruta a la carpeta temporal. Para obtener el directorio ''tmp'' predeterminado, use:
defult_tmp_dir = tempfile._get_default_tempdir()
% results in: /tmp
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 diferencia de tiempo entre llamar a este y tratar de crear el archivo. Sin embargo, en mi caso, la posibilidad de que esto ocurra es muy escasa e incluso si fallara sería aceptable. Pero depende de usted para evaluar su caso de uso.