如何从 S3 加载 pickle 文件以在 AWS Lambda 中使用?
How to load a pickle file from S3 to use in AWS Lambda?
我目前正在尝试将一个 pickle 文件从 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'
有什么想法吗?
如download_fileobj
的文档所示,您需要先以二进制write模式打开文件并保存到文件中。下载文件后,您可以打开它进行阅读和解压。
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 可能会更好,以避免必须写入然后立即读取文件。您还可以写入一个 in-memory 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)
超级简单的解决方案
import pickle
import boto3
s3 = boto3.resource('s3')
my_pickle = pickle.loads(s3.Bucket("bucket_name").Object("key_to_pickle.pickle").get()['Body'].read())
这是最简单的解决方案。您甚至可以使用 S3FileSystem
加载数据而无需在本地下载文件
from s3fs.core import S3FileSystem
s3_file = S3FileSystem()
data = pickle.load(s3_file.open('{}/{}'.format(bucket_name, file_path)))
我目前正在尝试将一个 pickle 文件从 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'
有什么想法吗?
如download_fileobj
的文档所示,您需要先以二进制write模式打开文件并保存到文件中。下载文件后,您可以打开它进行阅读和解压。
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 可能会更好,以避免必须写入然后立即读取文件。您还可以写入一个 in-memory 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)
超级简单的解决方案
import pickle
import boto3
s3 = boto3.resource('s3')
my_pickle = pickle.loads(s3.Bucket("bucket_name").Object("key_to_pickle.pickle").get()['Body'].read())
这是最简单的解决方案。您甚至可以使用 S3FileSystem
加载数据而无需在本地下载文件from s3fs.core import S3FileSystem
s3_file = S3FileSystem()
data = pickle.load(s3_file.open('{}/{}'.format(bucket_name, file_path)))