如何从 S3 加载 pickle 文件以在 AWS Lambda 中使用?

新手上路,请多包涵

我目前正在尝试将一个 pickled 文件从 S3 加载到 AWS lambda 中并将其存储到一个列表中(pickle 是一个列表)。

这是我的代码:

 import pickle
import boto3

s3 = boto3.resource('s3')
with open('oldscreenurls.pkl', 'rb') as data:
    old_list = s3.Bucket("pythonpickles").download_fileobj("oldscreenurls.pkl", data)

即使文件存在,我也会收到以下错误:

 FileNotFoundError: [Errno 2] No such file or directory: 'oldscreenurls.pkl'

有任何想法吗?

原文由 mifin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 717
2 个回答

download_fileobj 的文档所示,您需要以二进制 写入 模式打开文件并先保存到文件中。下载文件后,您可以打开它进行阅读和解压。

 import pickle
import boto3

s3 = boto3.resource('s3')
with open('oldscreenurls.pkl', 'wb') as data:
    s3.Bucket("pythonpickles").download_fileobj("oldscreenurls.pkl", data)

with open('oldscreenurls.pkl', 'rb') as data:
    old_list = pickle.load(data)

download_fileobj 获取 S3 中对象的名称加上本地文件的句柄,并将该对象的内容保存到文件中。此函数还有一个名为 download_file 的版本,它采用文件名而不是打开的文件句柄并为您打开它。

在这种情况下,使用 S3Client.get_object 可能会更好,以避免必须写入然后立即读取文件。您还可以写入内存中的 BytesIO 对象,它就像一个文件,但实际上并不接触磁盘。这看起来像这样:

 import pickle
import boto3
from io import BytesIO

s3 = boto3.resource('s3')
with BytesIO() as data:
    s3.Bucket("pythonpickles").download_fileobj("oldscreenurls.pkl", data)
    data.seek(0)    # move back to the beginning after writing
    old_list = pickle.load(data)

原文由 avigil 发布,翻译遵循 CC BY-SA 3.0 许可协议

超级简单的解决方案

import pickle
import boto3

s3 = boto3.resource('s3')
my_pickle = pickle.loads(s3.Bucket("bucket_name").Object("key_to_pickle.pickle").get()['Body'].read())

原文由 kindjacket 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题