pickling python 对象到谷歌云存储

Jo *_*ran 6 python google-app-engine pickle google-cloud-storage

我一直在将对象腌制到文件系统,并在需要处理这些对象时读回它们。目前我有这个目的的代码。

def pickle(self, directory, filename):
    if not os.path.exists(directory):
        os.makedirs(directory)
    with open(directory + '/' + filename, 'wb') as handle:
        pickle.dump(self, handle)

@staticmethod
def load(filename):
    with open(filename, 'rb') as handle:
        element = pickle.load(handle)
    return element
Run Code Online (Sandbox Code Playgroud)

现在我正在将我的应用程序(django)移动到Google应用程序引擎,并发现应用程序引擎不允许我写入文件系统。谷歌云存储似乎是我唯一的选择,但我无法理解如何将我的对象p​​ickle为云存储对象并将它们读回以创建原始的python对象。

Dan*_*scu 6

您可以使用Cloud Storage 客户端库

而不是open()使用cloudstorage.open()(或者gcs.open()如果导入cloudstoragegcs,如上述文档中所示)并注意完整文件路径以 GCS 存储桶名称(作为目录)开头。

更多详细信息,请参阅cloudstorage.open() 文档


LaS*_*Sul 6

对于 Python 3 用户,您可以使用gcsfsDask Creator 中的库来解决您的问题。

示例阅读:

import gcsfs

fs = gcsfs.GCSFileSystem(project='my-google-project')
fs.ls('my-bucket')
>>> ['my-file.txt']
with fs.open('my-bucket/my-file.txt', 'rb') as f:
    print(f.read())
Run Code Online (Sandbox Code Playgroud)

不过,它基本上与 pickle 相同:

with fs.open(directory + '/' + filename, 'wb') as handle:
        pickle.dump(shandle)
Run Code Online (Sandbox Code Playgroud)

阅读起来,这很相似,但wbrbdump替换load

with fs.open(directory + '/' + filename, 'rb') as handle:
        pickle.load(handle)
Run Code Online (Sandbox Code Playgroud)