2009-07-29 19 views
19

official documentation for TemporaryFile brzmi:Python - tempfile.TemporaryFile nie można odczytać; czemu?

trybie ustawień domyślnych parametrów do „w + B” tak, że plik stworzony mogą być odczytywane i zapisywane bez zamknięte.

Jeszcze, poniżej kod nie działa zgodnie z oczekiwaniami:

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() 

Wyjście pojawia się:

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

Może ktoś wyjaśnić to zachowanie? Czy istnieje sposób na odczytanie z plików tymczasowych? (bez konieczności używania niskiego poziomu mkstemp, który nie powoduje automatycznego usuwania plików, i nie interesują mnie nazwane pliki)

+1

Używanie 'flush' nie pomogło. –

Odpowiedz

35

Musisz umieścić

f.seek(0) 

przed próby odczytu pliku (to wyśle ​​cię do początku pliku), a

f.seek(0, 2) 

aby powrócić do końca, dzięki czemu można zapewnić nie zastąpisz go.

+17

Zamiast 'f.seek (0, 2)' użyłbym 'f.seek (0, os.SEEK_END)' –

+0

Byłem tak zdezorientowany, dlaczego nie mogłem "odczytać()" niczego, zacząłem bawić się 'delete = True' i 'try ... finally: os.remove()' ... wszystko, ponieważ zapomniałem o 'os.seek()'! Uratowałem 10 brzydkich linii kodu – dwanderson

7

read() nic nie zwraca, ponieważ znajdujesz się na końcu pliku. Musisz zadzwonić pod numer seek() najpierw, zanim read() zwróci cokolwiek. Na przykład, umieścić tę linię przed pierwszym read():

f.seek(-10, 1) 

Oczywiście, przed napisaniem ponownie, należy seek() do końca (jeśli jest to gdzie chcesz kontynuować pisanie to).

Powiązane problemy