2012-02-03 101 views
1

我正在使用AppEngine在我的应用中存储一些pickled python对象。我想直接向用户提供这些信息,并且我只是使用X-AppEngine-Blobkey标题将文件以file.pickle.gz文件名提供给用户。但是,当我尝试使用简单的双击将我的计算机(Mac OS)提取这些文件时,这些文件将变成file.pickle.gz.cpgzAppengine提供gzip压缩文件

我认为这是我的浏览器是偷偷摸摸的,并提取它们,但我不这么认为,因为

pickle.load('file.pickle.gz') 

不行的,而且也不

pickle.load('file.pickle.gz.cpgz') 

要存储文件,我用:

blobfile = files.blobstore.create(mime_type='application/gzip') 
    with files.open(blobfile, 'a') as f: 
     gz = gzip.GzipFile(fileobj=f,mode='wb') 
     gz.write(my_pickled_object) 
     gz.close() 
    files.finalize(blobfile) 

我想我不理解gzips的工作方式。有人可以解释吗?

回答

1

您确定file.pickle.gz.cpgz是您双击下载的file.pickle.gz文件的结果吗?通常“.cpgz”是一种不同类型的存档文件。

我可以获取您在发布服务器上发布的代码,而无需进行重大更改。这里的代码,如果有帮助的话:

#!/usr/bin/env python 

from __future__ import with_statement 
import gzip 
import pickle 
from google.appengine.api import files 
from google.appengine.api import memcache 
from google.appengine.ext import blobstore 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import blobstore_handlers 
from google.appengine.ext.webapp import util 

class MainHandler(webapp.RequestHandler): 
    def get(self): 
     self.response.out.write('Hello world! <a href="/make">make</a> <a href="/get">get</a>') 

class MakeFileHandler(webapp.RequestHandler): 
    def get(self): 
     data = pickle.dumps({'a':1, 'b':True, 'c':None}) 

     blobfile = files.blobstore.create(mime_type='application/gzip') 
     with files.open(blobfile, 'a') as f: 
      gz = gzip.GzipFile(fileobj=f,mode='wb') 
      gz.write(data) 
      gz.close() 
     files.finalize(blobfile) 
     memcache.set('filekey', files.blobstore.get_blob_key(blobfile)) 
     self.redirect('/') 

class GetFileHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self): 
     blobkey = memcache.get('filekey') 
     if blobkey: 
      self.send_blob(blobkey) 
     else: 
      self.response.out.write('No data key set <a href="/">back</a>') 

def main(): 
    application = webapp.WSGIApplication([('/', MainHandler), 
              ('/make', MakeFileHandler), 
              ('/get', GetFileHandler)], 
             debug=True) 
    util.run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

点击“make”,然后点击“get”。名为“get.gz”的文件会下载到您的~/Downloads/文件夹中(至少在Chrome中)。双击它以生成一个名为“get”的文件。然后:

% python 
>>> import pickle 
>>> pickle.load(open('get')) 
{'a': 1, 'c': None, 'b': True} 
+1

你是对的,我的代码工作。 “您是否尝试关闭并再次打开?”。 – noio 2012-02-04 11:53:16