3

我正在尝试使用 XML 和 HTTP POST 的 zip 将大型 CSV 文件上传到 GAE

脚步:

  • CSV 被压缩和 base64 编码并通过 XML/HTTP POST 发送到 GAE

  • GAE - 使用 minidom 解析 XML

  • GAE - Base64 解码 ZIP

  • GAE - 从 Zip 文件中获取 CSV。

我尝试使用 zipfile,但不知道如何从 base 64decoded 字符串创建 zipfile 对象

我得到:TypeError:必须使用 ZipFile 实例作为第一个参数调用未绑定的方法 read()(改为获取 str 实例)

myZipFile = base64.decodestring(base64ZipFile)

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

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

4 回答 4

3

正如 Rob 提到的,ZipFile需要一个类似文件的对象。您可以使用StringIO为字符串提供类似文件的接口。

例如:

import StringIO

myZipFile = base64.decodestring(base64ZipFile)

objZip = zipfile.ZipFile(StringIO.StringIO(myZipFile),'r')
于 2012-01-18T08:28:59.590 回答
2

是的你可以。事实上,我写了一篇博客文章,描述了如何做到这一点

于 2012-01-19T00:42:31.273 回答
1

一种简单的方法可能是使用blob 上传 API将压缩的 csv 上传到 blobstore ,然后从那里处理 zip 文件。您需要伪造一个表单帖子,但在应用引擎方面,您的生活可能会更简单。

在AppEngine MapReduce中有一个如何处理压缩数据的示例。请参阅BlobstoreZipInputReader类。

于 2012-01-18T05:50:34.120 回答
0

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)
于 2012-01-18T05:19:50.553 回答