2008-10-03 17 views
48

tempfile.mkstemp() devuelve:Python: ¿cómo convierto "un manejador de nivel de sistema operativo a un archivo abierto" a un objeto de archivo?

una tupla que contiene un identificador de nivel de sistema operativo en un archivo abierto (como sería devuelto por os.open()) y el nombre de ruta absoluta de ese archivo, en ese orden.

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

Los documentation for os.open() estados:

para envolver un descriptor de archivo en un "archivo objeto", el uso fdopen().

así que he intentado:

>>> 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 
+0

Recuerde marcar una respuesta como "Aceptada" si trabajado para ti –

Respuesta

49

Usted puede utilizar

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

escribir en el mango.

Si desea abrir la manija para escribir es necesario agregar la "w" modo

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

Eso funciona, gracias. Pero técnicamente fdopen devuelve un objeto de archivo (y se pasa un descriptor de archivo), así que si pudiera editar su respuesta, lo cambiaría a "f = os.fdopen (tup [0]," w "); f.write ("foo") –

+0

Si no usa 'os.fdopen', debe asegurarse de cerrar el manejador del archivo temporal con os.close (tup [0]) según http://www.logilab.org/blogentry/17873. – deterb

6

Usted se olvidó de especificar el modo de apertura ('w') en fdopen(). El valor predeterminado es 'r', lo que hace que la llamada write() falle.

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

1

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

+0

No quiero que el archivo se destruya tan pronto como se cierre. (Y quiero asegurarme de que el archivo sea visible.) –

+3

, luego puede pasar delete = False a NamedTemporaryFile – hoju

13

continuación se explica cómo hacerlo utilizando una sentencia 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') 
+1

Es 'closing' realmente necesario? 'os.fdopen' devuelve un' TextIOWrapper' cuyo '__exit__' salió para cerrarlo, probado en Python 3.5 (CPython). – timdiels

4
temp = tempfile.NamedTemporaryFile(delete=False) 
temp.file.write('foo\n') 
temp.close() 
+2

El parámetro" eliminar "se agregó en la versión 2.6, por lo que no funcionará para versiones anteriores Versiones de Python. – alberge

0

que no puedo comentar sobre las respuestas, por lo que voy a publicar mi comentario aquí:

Para crear un archivo temporal para el 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") 
Cuestiones relacionadas