代码之家  ›  专栏  ›  技术社区  ›  mifin

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

  •  27
  • mifin  · 技术社区  · 7 年前

    我目前正在尝试将一个经过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'
    

    有什么想法吗?

    3 回复  |  直到 7 年前
        1
  •  45
  •   kindjacket    5 年前

    超级简单解决方案

    import pickle
    import boto3
    
    s3 = boto3.resource('s3')
    my_pickle = pickle.loads(s3.Bucket("bucket_name").Object("key_to_pickle.pickle").get()['Body'].read())
    
        2
  •  21
  •   avigil    7 年前

    如文档所示 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)
    

    下载\u fileobj 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)
    
        3
  •  15
  •   Naren Babu R    5 年前

    这是最简单的解决方案。您可以加载数据,而无需使用 S3文件系统

    from s3fs.core import S3FileSystem
    s3_file = S3FileSystem()
    
    data = pickle.load(s3_file.open('{}/{}'.format(bucket_name, file_path)))