2012-08-13 7 views
8

Estoy intentando utilizar mkstemp con Python 3:¿Cómo obtener un objeto de archivo de mkstemp()?

Python 3.2.3 (default, Jun 25 2012, 23:10:56) 
[GCC 4.7.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from tempfile import mkstemp 
>>> mkstemp() 
(3, '/tmp/tmp080316') 

De acuerdo con la documentation, el primer elemento de la tupla se supone que es un identificador de archivo. De hecho, es un int. ¿Cómo obtengo un objeto de archivo adecuado?

Respuesta

9

En la documentación de mktemp se puede ver un ejemplo de cómo utilizar NamedTemporaryFile la manera deseada: http://docs.python.org/dev/library/tempfile.html?highlight=mkstemp#tempfile.mktemp

>>> f = NamedTemporaryFile(delete=False) 
>>> f 
<open file '<fdopen>', mode 'w+b' at 0x384698> 

Esto proporciona el mismo comportamiento que mkstemp, pero devuelve un objeto de archivo.

+1

Eso es genial. Quería usar 'mkstemp' porque el archivo contendrá información confidencial y se olvidó de que NamedTemporaryFile realmente lo usa. – Erik

0

El int representa un identificador de archivo a nivel del sistema operativo. Lo que realmente necesito es un objeto de archivo de más alto nivel. Para hacer uno, utiliza:

os_handle = mkstemp() 
f = open(mkstemp()[0]) 
+4

No quiere decir 'OS .fdopen'? –

+0

'os.fdopen' hace exactamente lo mismo que' open' excepto que solo acepta manejadores de archivos, no rutas de archivos. – Erik

+5

No creo que sea cierto: 'open (0)' me da * TypeError: coercing a Unicode: need string o buffer, int found * que es lo que esperaba. Al menos, creo que contar abierto para aceptar un int no será muy portátil. ** Actualización: ** esto funciona en Python3, pero no en Python2 (si te importa) – poolie

2

La mejor forma que conozco es usando tempfile.NamedTemporaryFile, como puede ver en la respuesta de @tordek.

Pero si usted tiene un FD prima desde el sistema operativo subyacente, usted puede hacer esto para convertirlo en un objeto de archivo:

f = open(fd, closefd=True) 

Esto funciona en Python 3

Cuestiones relacionadas