2011-06-09 18 views
11

Así que tienen un objeto StringIO() tipo fichero, y yo estoy tratando de escribirla en un ZipFile(), pero me da este TypeError:¿Cómo puedo pasar un objeto Python StringIO() a un ZipFile(), o no es compatible?

coercing to Unicode: need string or buffer, cStringIO.StringI found 

Este es un ejemplo del código que estoy utilizando:

file_like = StringIO() 
archive = zipfile.ZipFile(file_like, 'w', zipfile.ZIP_DEFLATED) 

# my_file is a StringIO object returned by a remote file storage server. 
archive.write(my_file) 

Los documentos dicen que StringIO() es una clase de archivo y que ZipFile() puede aceptar un objeto similar a un archivo. ¿Hay algo que este olvidando? Cualquier ayuda sería muy apreciada.

¡Gracias de antemano!

+3

El parámetro para ['ZipFile.write()'] (http://docs.python.org/library/zipfile.html#zipfile.ZipFile.write) es un nombre de archivo. –

+1

Acabo de encontrar esto; ¿Hay un error tipográfico en tu segunda línea, o fue ese tu código real? 'ZipFile (file_file' en lugar de' ZipFile (file_like' – Bogdacutu

Respuesta

12

Para añadir una cadena a un ZipFile es necesario utilizar el método WriteStr y pasar la cadena de StringIO utilizando el método de la instancia getValue StringIO

por ejemplo,

archive.writestr("name of file in zip", my_file.getvalue()) 

Tenga en cuenta que también necesita dar el nombre de la cadena para indicar dónde se coloca en el archivo zip.

Cuestiones relacionadas