3

XML と HTTP POST を使用して zip を使用して、大きな CSV ファイルを GAE にアップロードしようとしています。

手順:

  • CSV は圧縮され、base64 でエンコードされ、XML/HTTP POST 経由で GAE に送信されます

  • GAE - minidom を使用して XML を解析する

  • GAE - Base64 デコード ZIP

  • GAE - Zip ファイルから CSV を取得します。

zipfile を使用してみましたが、ベース 64 でデコードされた文字列から 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')
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

簡単な方法は、ブロブ アップロード APIを使用して圧縮された csv をブロブストアにアップロードし、そこから zip ファイルを処理することです。フォーム投稿を偽造する必要がありますが、appengine 側の方が簡単かもしれません。

AppEngine MapReduceで圧縮されたデータを処理する方法の例があります。BlobstoreZipInputReaderクラスを参照してください。

于 2012-01-18T05:50:34.120 に答える
0

ZipFile文字列ではなく、ファイルのようなオブジェクトを取ります。

1つの解決策は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 に答える