您可以在 Google App 引擎 - Python 上解压和查看内容吗?

Posted

技术标签:

【中文标题】您可以在 Google App 引擎 - Python 上解压和查看内容吗?【英文标题】:Can you Unzip and view content on Google App engine - Python? 【发布时间】:2012-01-18 05:00:14 【问题描述】:

我正在尝试使用 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: unbound method read() must be called with ZipFile instance as first argument (得到 str 实例)

myZipFile = base64.decodestring(base64ZipFile)

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

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

【问题讨论】:

根本没有理由对文件进行base64编码。 @NickJohnson:我认为 base64 编码就在那里,因为 Bezerk 将它封装在 XML 中,但这也可能被跳过(除非 XML 中的内容不仅仅是压缩的 CSV 文件)。 好吧,这让它更没有意义了。 :) 我这样做是出于习惯使用 XML/http 帖子。这些年来,我一直遇到外部文件的问题。 【参考方案1】:

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

例如:

import StringIO

myZipFile = base64.decodestring(base64ZipFile)

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

【讨论】:

谢谢。我使用了与您的建议类似的方法,并且奏效了。【参考方案2】:

是的,你可以。其实我写了一篇博文就是describes how to do exactly that。

【讨论】:

感谢您的快速回复。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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)

【讨论】:

很遗憾,应用引擎不允许创建临时文件。 @SaxonDruce,我的印象是你可以使用TemporaryFile,但不能使用NamedTemporaryFile。 Quick google seems to confirm。但是我自己没有尝试过。 啊,我看到“临时文件被禁用,除了别名为 StringIO 的 TemporaryFile” - 我之前没有注意到 :) 这还需要将整个 blob 读入内存,这是一个坏主意,因为已经有一个 blobreader API 可以为您提供类似文件的对象。 @NickJohnson,除了整个 blob 已经在内存中。感谢您的反对。

以上是关于您可以在 Google App 引擎 - Python 上解压和查看内容吗?的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Tasks 和 Google App Engine Python 3

使用Google App Engine GQL查找给定半径内的所有位置

在 Google App Engine 数据存储中存储分层数据?

Java堆转储在Google App引擎标准环境中?

Google的App引擎添加了对Node.js的支持

Google App Engine 的模板引擎 [关闭]