tempfile namedtemporaryfile example python temporary-files mkstemp fdopen

namedtemporaryfile - Python: ¿cómo convierto "un manejador de nivel de sistema operativo a un archivo abierto" a un objeto de archivo?



tempfile ruby (6)

¿Cuál es tu objetivo aquí? ¿Es tempfile.TemporaryFile inadecuado para sus propósitos?

tempfile.mkstemp () devuelve:

una tupla que contiene un identificador de nivel de sistema operativo a un archivo abierto (como lo devolvería os.open ()) y la ruta de acceso absoluta de ese archivo, en ese orden.

¿Cómo convierto ese identificador de nivel de sistema operativo a un objeto de archivo?

La documentación para os.open () indica:

Para envolver un descriptor de archivo en un "objeto de archivo", use fdopen ().

Así que lo intenté:

>>> import tempfile >>> tup = tempfile.mkstemp() >>> import os >>> f = os.fdopen(tup[0]) >>> f.write(''foo/n'') Traceback (most recent call last): File "<stdin>", line 1, in ? IOError: [Errno 9] Bad file descriptor


Olvidó especificar el modo abierto (''w'') en fdopen (). El valor predeterminado es ''r'', lo que hace que la llamada write () falle.

Creo que mkstemp () crea el archivo solo para lectura. Llamar a fdopen con ''w'' probablemente lo vuelva a abrir para escribir ( puede volver a abrir el archivo creado por mkstemp).


Puedes usar

os.write(tup[0], "foo/n")

para escribir en el mango

Si desea abrir el controlador para escribir, necesita agregar el modo "w"

f = os.fdopen(tup[0], "w") f.write("foo")


He aquí cómo hacerlo usando una declaración with:

from __future__ import with_statement from contextlib import closing fd, filepath = tempfile.mkstemp() with closing(os.fdopen(fd, ''w'')) as tf: tf.write(''foo/n'')


No puedo comentar las respuestas, por lo que publicaré mi comentario aquí:

Para crear un archivo temporal para acceso de escritura, puede usar tempfile.mkstemp y especificar "w" como el último parámetro, como:

f = tempfile.mkstemp("", "", "", "w") # first three params are ''suffix, ''prefix'', ''dir''... os.write(f[0], "write something")


temp = tempfile.NamedTemporaryFile(delete=False) temp.file.write(''foo/n'') temp.close()