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

Brian picture Brian · Jun 9, 2011 · Viewed 7.5k times · Source

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!

Answer

mmmmmm picture mmmmmm · Jun 10, 2011

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.