如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?
Posted
技术标签:
【中文标题】如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?【英文标题】:How to load a pickle file from S3 to use in AWS Lambda? 【发布时间】:2018-08-04 11:22:11 【问题描述】:我目前正在尝试将腌制文件从 S3 加载到 AWS lambda 中并将其存储到列表中(腌制是一个列表)。
这是我的代码:
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'
有什么想法吗?
【问题讨论】:
【参考方案1】:超级简单的解决方案
import pickle
import boto3
s3 = boto3.resource('s3')
my_pickle = pickle.loads(s3.Bucket("bucket_name").Object("key_to_pickle.pickle").get()['Body'].read())
【讨论】:
我喜欢这个答案,因为它有效、简单、直接。 这是一个很好的解决方案。使 s3 上的 pkl 几乎与 s3 路径的 pd.read_csv 集成一样可访问。【参考方案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)
【讨论】:
编辑:我不知道如何在 cmets 中使用代码块。在您发布示例之前,我阅读了这篇文章并尝试了 get_object 路由,并且下面的代码有效!谢谢! response = s3client.get_object(Bucket="pythonpickles", Key="oldscreenurls.pkl") pickled_list = response['Body'].read() old_list = pickle.loads(pickled_list)【参考方案3】:这是最简单的解决方案。您甚至可以使用 S3FileSystem
在本地加载数据而无需下载文件from s3fs.core import S3FileSystem
s3_file = S3FileSystem()
data = pickle.load(s3_file.open('/'.format(bucket_name, file_path)))
【讨论】:
以上是关于如何从 S3 加载泡菜文件以在 AWS Lambda 中使用?的主要内容,如果未能解决你的问题,请参考以下文章
使用nodejs AWS lambda从S3加载并解析yaml文件
如何从一个账户访问 s3 存储桶中的数据以在另一个账户中使用 redshift 处理数据?
用于将数据从AWS S3加载到Redshift的Python脚本