Можете ли вы распаковать и просмотреть контент на движке Google App - Python? - PullRequest
3 голосов
/ 18 января 2012

Я пытаюсь загрузить большие файлы CSV в GAE, используя почтовый индекс, используя XML & HTTP POST

Шаги:

  • CSV архивируется и кодируется в base64 и отправляется вGAE через XML / HTTP POST

  • GAE - использование минидома для анализа XML

  • GAE - декодирование Base64 ZIP

  • GAE - Получить CSV из Zip-файла.

Я пытался использовать zipfile, но не могу понять, как создать объект zipfile из базовой 64-кодированной строки

Я получаю: TypeError: необязательный метод read () должен быть вызван с экземпляром ZipFile в качестве первого аргумента (вместо этого получен экземпляр str)

myZipFile = base64.decodestring(base64ZipFile)

objZip = zipfile.ZipFile(myZipFile,'r')

strCSV = zipfile.ZipFile.read(objZip,'list.csv')

Ответы [ 4 ]

3 голосов
/ 18 января 2012

Как уже упоминал Роб, ZipFile требует объект, подобный файлу.Вы можете использовать StringIO для предоставления файлового интерфейса для строки.

Например:

import StringIO

myZipFile = base64.decodestring(base64ZipFile)

objZip = zipfile.ZipFile(StringIO.StringIO(myZipFile),'r')
2 голосов
/ 19 января 2012

Да, вы можете. На самом деле, я написал в блоге, что описывает, как именно это сделать .

1 голос
/ 18 января 2012

Простым подходом может быть выгрузка заархивированного csv в хранилище BLOB-объектов с использованием API загрузки BLOB-объектов и обработка файла zip оттуда. Вам нужно будет подделать форму сообщения, но жизнь для вас может быть проще на стороне устройства.

Есть пример того, как обрабатывать сжатые данные в AppEngine MapReduce . См. Класс BlobstoreZipInputReader .

0 голосов
/ 18 января 2012

ZipFile принимает не строку, а файлоподобный объект.

Одним из решений является создание tempfile для записи строки впередавая это ZipFile:

import tempfile
import zipfile

tmp = tempfile.TemporaryFile()
tmp.write(myZipFile) # myZipFile is your decoded string containing the zip-data
objZip = zipfile.ZipFile(tmp)
...