2010-10-13 26 views
26

Quiero usar tempfile.NamedTemporaryFile() para escribir algunos contenidos en él y luego abrir ese archivo. He escrito el código siguiente:cómo usar tempfile.NamedTemporaryFile() en python

tf = tempfile.NamedTemporaryFile() 
tfName = tf.name 
tf.seek(0) 
tf.write(contents) 
tf.flush() 

pero soy incapaz de abrir este archivo y ver su contenido en el bloc de notas o una aplicación similar. ¿Hay alguna forma de lograr esto? Por qué no puedo hacer algo como:

os.system('start notepad.exe ' + tfName) 

al final

+1

¿Por qué necesita usar 'tempfile'? ¿No puedes usar un archivo normal, especialmente si quieres guardarlo después? –

+1

No quiero guardarlo en mi sistema. Solo quiero que esos contenidos se abran como un texto en un bloc de notas o aplicación similar y borrar el archivo cuando cierro esa aplicación – Manoj

Respuesta

39

Esto podría ser una de dos razones:

En primer lugar, por defecto el archivo temporal es deleted as soon as it is closed. Para arreglar este uso:

tf = tempfile.NamedTemporaryFile(delete=False) 

y luego elimine el archivo manualmente una vez que haya terminado de verlo en la otra aplicación.

Alternativamente, podría ser porque el archivo todavía está abierto en Python Windows no le permitirá abrirlo con otra aplicación.

+16

Entonces, ¿cuál es la mejor manera de eliminarlo cuando termine? 'tf.unlink'? 'os.remove'? 'path.remove'? –

+1

@ThomasAhle ¿Qué usarías? –

+0

Necesita agregar la importación: 'import tempfile' para usar. –

20

También puede usarlo con un administrador de contexto para que el archivo se cierre/elimine cuando se salga del alcance. También se limpiará si aumenta el código en el administrador de contexto.

import tempfile 
with tempfile.NamedTemporaryFile() as temp: 
    temp.write('Some data') 
    temp.flush() 

    # do something interesting with temp before it is destroyed 
+3

Tenga en cuenta que no puede pasar 'temp.name' a otros procesos para hacer algo con él en Windows (que parece ser la plataforma de OP). Del manual: "Si el nombre se puede usar para abrir el archivo una segunda vez, mientras el archivo temporal nombrado todavía está abierto, varía en todas las plataformas (puede usarse así en Unix, no puede en Windows NT o posterior)." – Vegard

+0

No estoy seguro de si ayudaría de alguna manera, pero Django sobrescribió el NamedTemporaryFile para que funcione con Windows, por lo que valdría la pena ver lo que hicieron para que eso suceda: https://code.djangoproject.com/wiki/NamedTemporaryFile – vjimw

+2

Parece que es necesario llamar a 'flush' (De lo contrario, aparece un error en un subproceso llamado para leer desde el archivo). –

Cuestiones relacionadas