【问题标题】:How to load a pickle file from S3 to use in AWS Lambda?如何从 S3 加载泡菜文件以在 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'

有什么想法吗?

【问题讨论】:

    标签: python amazon-web-services amazon-s3 lambda pickle


    【解决方案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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2017-01-29
      相关资源
      最近更新 更多