2009-07-29 19 views
19

El official documentation for TemporaryFile lee:Python - tempfile.TemporaryFile no se puede leer; ¿por qué?

parámetros

El modo por defecto es 'w + b' para que el archivo creado se puede leer y escrito sin ser cerrada.

Sin embargo, el código de abajo no funciona como se esperaba:

import tempfile 

def play_with_fd(): 
    with tempfile.TemporaryFile() as f: 
     f.write('test data\n') 
     f.write('most test data\n') 

     print 'READ:', f.read() 

     f.write('further data') 

     print 'READ:', f.read() 

     f.write('even more') 
     print 'READ:', f.read() 

     print 'READ:', f.read() 
     print 'READ:', f.read() 

if __name__ == '__main__': 
    play_with_fd() 

La salida lo que consigo es:

> python play.py 
READ: 
READ: 
READ: 
READ: 
READ: 

¿Puede alguien explicar este comportamiento? ¿Hay alguna manera de leer archivos temporales? (sin tener que utilizar el mkstemp de nivel bajo que no eliminaría automáticamente los archivos, y no me importan los archivos con nombre)

+1

Usar un 'flush' no ayudó. –

Respuesta

35

Debe poner

f.seek(0) 

antes de intentar leer el archivo (esto le enviará al principio del archivo), y

f.seek(0, 2) 

para volver a la final para que pueda asegurar no lo sobreescribirás

+17

En lugar de 'f.seek (0, 2)' Usaría 'f.seek (0, os.SEEK_END)' –

+0

Estaba tan confundido por qué no podía 'leer()' cualquier cosa, empecé a jugar con 'borrar = True' y 'try ... finally: os.remove()' ... todo porque me olvidé de 'os.seek()'! Me salvó 10 feas líneas de código – dwanderson

7

read() no devuelve nada porque se encuentra al final del archivo. Debe llamar al seek() antes de que read() devuelva algo. Por ejemplo, poner esta línea en frente de la primera read():

f.seek(-10, 1) 

Por supuesto, antes de escribir de nuevo, asegúrese de seek() hasta el final (si es ahí donde desea continuar escribiendo a).

Cuestiones relacionadas