2012-04-22 14 views
53

Uso de la versión de Python2.7. A continuación está mi código de muestra.Error al obtener datos sobre el uso de read() de StringIO en python

import StringIO 
import sys 

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

en el anterior programa, leer() me devuelve nada donde como getValue() me devuelve "hola". ¿Alguien puede ayudarme a solucionar el problema? Necesito leer() porque mi siguiente código implica leer "n" bytes.

+0

no hay ninguna función llamada 'leer()' en [Stringio] (http://docs.python.org/library/stringio.html#module-StringIO) – hjpotter92

+0

@ ChasingDeath: Sí, lo hay. Pruebe 'dir (StringIO.StringIO)'. –

+2

sí, StringIO crea un archivo como objeto para cadenas, por supuesto, 'read()' – jamylak

Respuesta

77

Debe restablecer la posición del búfer al principio. Puedes hacer esto haciendo buff.seek(0).

Cada vez que lee o escribe en el búfer, la posición avanza en uno. Digamos que comienzas con un buffer vacío.

El valor del almacenamiento intermedio es "", la posición del almacenamiento intermedio es 0. Lo haces buff.write("hello"). Obviamente, el valor del buffer ahora es hello. La posición del buffer, sin embargo, ahora es 5. Cuando llame al read(), ¡no hay nada más allá de la posición 5 para leer! Entonces devuelve una cadena vacía.

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) es lo que me faltaba cuando estaba tratando de volcar un pickle a StringIO y subirlo a s3. Una vez que retrocedí al principio, mi objeto s3 se llenaría correctamente. – Matthew

Cuestiones relacionadas