Как я могу передать объект Python StringIO() в ZipFile() или он не поддерживается?

Итак, у меня есть файловый объект StringIO(), и я пытаюсь чтобы записать его в ZipFile(), но я получаю эту ошибку TypeError:

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

Вот пример кода, который я использую:

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)

В документах говорится, что StringIO() — это файлоподобный класс и что < a href="http://docs.python.org/library/zipfile.html#zipfile-objects" rel="nofollow noreferrer">ZipFile() может принимать файлоподобный объект. Есть ли что-то, что мне не хватает? Любая помощь будет принята с благодарностью.

Заранее спасибо!


person Brian    schedule 09.06.2011    source источник
comment
Параметр ZipFile.write() — это имя файла.   -  person Sven Marnach    schedule 10.06.2011
comment
Только что нашел это; есть ли опечатка во второй строке или это был ваш реальный код? ZipFile(file_file вместо ZipFile(file_like   -  person Bogdacutu    schedule 28.12.2011


Ответы (1)


Чтобы добавить строку в ZipFile, вам нужно использовать метод writestr и передать строку из StringIO, используя метод getvalue экземпляра StringIO.

e.g.

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

Обратите внимание, что вам также необходимо указать имя строки, чтобы сказать, где она находится в zip-файле.

person mmmmmm    schedule 09.06.2011