Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I pass a Python StringIO() object to a ZipFile(), or is it not supported?

So I have a StringIO() file-like object, and I am trying to write it to a ZipFile(), but I get this TypeError:

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

Here is a sample of the code I am using:

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)

The docs say that StringIO() is a file-like class and that ZipFile() can accept a file-like object. Is there something I am missing? Any help would be greatly appreciated.

Thanks in advance!

like image 559
Brian Avatar asked Jun 09 '11 21:06

Brian


1 Answers

To add a string to a ZipFile you need to use the writestr method and pass the string from StringIO using getvalue method of the StringIO instance

e.g.

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

Note you also need to give the name of the string to say where it is placed in the zip file.

like image 57
mmmmmm Avatar answered Oct 04 '22 03:10

mmmmmm