您可以在 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查找给定半径内的所有位置