【问题标题】:Can you Unzip and view content on Google App engine - Python?您可以在 Google App 引擎 - 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 帖子。这些年来,我一直遇到外部文件的问题。

标签: python google-app-engine csv zipfile


【解决方案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,但不能使用NamedTemporaryFileQuick google seems to confirm。但是我自己没有尝试过。
    • 啊,我看到“临时文件被禁用,除了别名为 StringIO 的 TemporaryFile” - 我之前没有注意到 :)
    • 这还需要将整个 blob 读入内存,这是一个坏主意,因为已经有一个 blobreader API 可以为您提供类似文件的对象。
    • @NickJohnson,除了整个 blob 已经在内存中。感谢您的反对。
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2016-04-04
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2011-09-29
    相关资源
    最近更新 更多