2011-09-26 16 views
5

me parece que obtener diferentes salidas:StringIO con archivos binarios?

from StringIO import * 

file = open('1.bmp', 'r') 

print file.read(), '\n' 
print StringIO(file.read()).getvalue() 

¿Por qué? ¿Es porque StringIO solo admite cadenas de texto o algo así?

+2

con ese código, el segundo file.read() no obtendría nada. Debería usar seek (0) antes de volver a leer el archivo. –

Respuesta

8

Cuando llame al file.read(), leerá todo el archivo en la memoria. Luego, si llama nuevamente al file.read() en el mismo objeto de archivo, ya habrá llegado al final del archivo, por lo que solo devolverá una cadena vacía.

En su lugar, intente, por ejemplo, reabrir el archivo:

from StringIO import * 

file = open('1.bmp', 'r') 
print file.read(), '\n' 
file.close() 

file2 = open('1.bmp', 'r') 
print StringIO(file2.read()).getvalue() 
file2.close() 

También puede utilizar la instrucción with para hacer que un código más limpio:

from StringIO import * 

with open('1.bmp', 'r') as file: 
    print file.read(), '\n' 

with open('1.bmp', 'r') as file2: 
    print StringIO(file2.read()).getvalue() 

Como acotación al margen, yo recomendaría abrir archivos binarios en modo binario: open('1.bmp', 'rb')

+0

Sí, tienes razón. Eso no resolvió completamente mi problema del mundo real, entonces descubrí que estaba escribiendo los datos en modo 'w' y obteniendo archivos corruptos, no 'wb'. Ahora todo funciona :) – Joelmc

+0

Creo que file.seek (0), propuesto por minhee, es un enfoque mucho mejor. – Gallaecio

-1

¿No debería estar usando "rb" para abrir, en lugar de solo "r", ya que este modo asume que solo procesará caracteres ASCII y EOF?

+0

En algunas plataformas (y en todas partes en Python 3) simplemente 'r' significa modo binario. Además, no agregue lemas/firmas a sus publicaciones. – agf

5

En realidad, el segundo file.read() devuelve una cadena vacía. Debe hacer file.seek(0) para rebobinar el desplazamiento interno del archivo.

Cuestiones relacionadas