2012-04-22 18 views
53

Korzystanie z wersji Python2.7. Poniżej znajduje się mój przykładowy kod.Nie można uzyskać danych o użyciu funkcji read() StringIO w pythonie

import StringIO 
import sys 

buff = StringIO.StringIO() 
buff.write("hello") 
print buff.read() 

w powyższym programie read() nie zwraca mi niczego, gdy getvalue() zwróci mi "cześć". Czy ktoś może mi pomóc w rozwiązaniu problemu? Potrzebuję read(), ponieważ mój następujący kod obejmuje czytanie bajtów "n".

+0

nie ma funkcji o nazwie 'read()' w [StringIO] (http://docs.python.org/library/stringio.html#module-StringIO) – hjpotter92

+0

@ ChasingDeath: Tak, jest. Spróbuj 'dir (StringIO.StringIO)'. –

+2

yeah StringIO tworzy plik podobny do obiektu dla łańcuchów, więc oczywiście byłby "read()" – jamylak

Odpowiedz

77

Musisz zresetować położenie bufora na początek. Możesz to zrobić, wykonując buff.seek(0).

Za każdym razem, gdy czytasz lub zapisujesz w buforze, pozycja jest zwiększana o jeden. Załóżmy, że zaczynasz od pustego bufora.

Wartość bufora to "", a dodatkowym buforem jest 0. Robisz buff.write("hello"). Oczywiście wartość bufora jest teraz równa hello. Pozycja bufora jest jednak teraz 5. Kiedy dzwonisz na numer read(), nic nie jest w stanie odczytać pozycji 5! Więc zwraca pusty ciąg.

11
In [38]: out_2 = StringIO.StringIO('not use write') # be initialized to an existing string by passing the string to the constructor 

In [39]: out_2.getvalue() 
Out[39]: 'not use write' 

In [40]: out_2.read() 
Out[40]: 'not use write' 

lub

In [5]: out = StringIO.StringIO() 

In [6]: out.write('use write') 

In [8]: out.seek(0) 

In [9]: out.read() 
Out[9]: 'use write' 
+0

out.seek (0) to, czego mi brakowało, gdy próbowałem zrzucić piklę do StringIO i przesłać do s3. Po przesunięciu do początku mój obiekt s3 zostanie poprawnie wypełniony. – Matthew