2012-04-22 5 views
53

Utilizzo della versione Python2.7. Di seguito è riportato il mio codice di esempio.Impossibile ottenere dati sull'uso di read() di StringIO in python

import StringIO 
import sys 

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

nel programma precedente, read() mi restituisce niente dove, come getvalue() mi restituisce "ciao". Qualcuno può aiutarmi a risolvere il problema? Ho bisogno di read() perché il mio codice seguente implica la lettura di "n" byte.

+0

non c'è funzione denominata 'read()' in [StringIO] (http://docs.python.org/library/stringio.html#module-StringIO) – hjpotter92

+0

@ ChasingDeath: Sì, c'è. Prova 'dir (StringIO.StringIO)'. –

+2

yeah StringIO crea un file come oggetto per le stringhe quindi ovviamente ci sarebbe 'read()' – jamylak

risposta

77

È necessario ripristinare la posizione del buffer all'inizio. Puoi farlo facendo buff.seek(0).

Ogni volta che si legge o scrive sul buffer, la posizione viene anticipata di uno. Supponi di iniziare con un buffer vuoto.

Il valore del buffer è "", il buffer è 0. Fai buff.write("hello"). Ovviamente il valore del buffer è ora hello. La posizione del buffer, tuttavia, è ora 5. Quando chiami read(), non c'è nulla di passato nella posizione 5 da leggere! Quindi restituisce una stringa vuota.

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' 

o

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) è ciò che mancava per me quando stavo provando a scaricare un pickle su StringIO e caricare su s3. Una volta ritornato all'inizio, il mio oggetto s3 sarebbe stato popolato correttamente. – Matthew

Problemi correlati