2009-07-29 6 views
19

Le official documentation for TemporaryFile lit:Python - tempfile.TemporaryFile ne peut pas être lu; Pourquoi?

Le paramètre par défaut du mode de « w + b » afin que le fichier créé peut être lu et écrit sans être fermée.

Cependant, le code ci-dessous ne fonctionne pas comme prévu:

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 sortie je reçois est:

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

Quelqu'un peut-il expliquer ce comportement? Y at-il un moyen de lire à partir de fichiers temporaires du tout? (sans avoir à utiliser le mkstemp bas niveau qui ne supprimerait pas automatiquement les fichiers, et je ne me soucie pas des fichiers nommés)

+1

L'utilisation de 'flush' n'a pas aidé. –

Répondre

35

Vous devez mettre

f.seek(0) 

avant d'essayer de lire le fichier (cela vous envoie au début du fichier), et

f.seek(0, 2) 

pour revenir à la fin afin que vous puissiez assurer vous ne l'écraserez pas.

+17

Au lieu de 'f.seek (0, 2)' j'utiliserais 'f.seek (0, os.SEEK_END)' –

+0

Était si confus pourquoi je ne pouvais pas 'lire()' quoi que ce soit, a commencé à jouer avec 'supprimer = True' et 'try ... enfin: os.remove()' ... tout cela parce que j'ai oublié 'os.seek()'! M'a sauvé 10 lignes moche de code – dwanderson

7

read() ne renvoie rien parce que vous êtes à la fin du fichier. Vous devez appeler seek() d'abord avant que read() renverra n'importe quoi. Par exemple, mettre cette ligne en face de la première read():

f.seek(-10, 1) 

Bien sûr, avant d'écrire à nouveau, assurez-vous de seek() à la fin (si c'est là que vous voulez continuer à écrire à).

Questions connexes