【问题标题】:Writing a pickle file to an s3 bucket in AWS将泡菜文件写入 AWS 中的 s3 存储桶
【发布时间】:2018-03-05 21:50:25
【问题描述】:

我正在尝试将 pandas 数据帧作为 pickle 文件写入 AWS 的 s3 存储桶中。我知道我可以将数据帧new_df 作为 csv 写入 s3 存储桶,如下所示:

bucket='mybucket'
key='path'

csv_buffer = StringIO()
s3_resource = boto3.resource('s3')

new_df.to_csv(csv_buffer, index=False)
s3_resource.Object(bucket,path).put(Body=csv_buffer.getvalue())

我尝试使用与上面相同的代码与to_pickle(),但没有成功。

【问题讨论】:

    标签: python pandas amazon-web-services amazon-s3


    【解决方案1】:

    进一步回答,您不需要转换为 csv。 pickle.dumps 方法返回一个字节 obj。看这里:https://docs.python.org/3/library/pickle.html

    import boto3
    import pickle
    
    bucket='your_bucket_name'
    key='your_pickle_filename.pkl'
    pickle_byte_obj = pickle.dumps([var1, var2, ..., varn]) 
    s3_resource = boto3.resource('s3')
    s3_resource.Object(bucket,key).put(Body=pickle_byte_obj)
    

    【讨论】:

    • 您有什么建议,如何将它与 pandas-Dataframe 一起使用?我试过 pickle_byte_obj = df.to_pickle(None).encode() 但它似乎不起作用
    • import s3fs 然后你可以df.to_csv('s3://bucket/path/fn.csv')
    【解决方案2】:

    我找到了解决方案,需要将 BytesIO 调用到 pickle 文件的缓冲区中,而不是 StringIO(用于 CSV 文件)。

    import io
    import boto3
    
    pickle_buffer = io.BytesIO()
    s3_resource = boto3.resource('s3')
    
    new_df.to_pickle(pickle_buffer)
    s3_resource.Object(bucket, key).put(Body=pickle_buffer.getvalue())
    

    【讨论】:

    • 使用此代码时出现错误:ValueError: Unrecognized compression type: infer
    • 我收到错误ValueError: I/O operation on closed file.
    • 如果您收到 ValueError: infer,请将压缩更改为无。它默认设置为推断。 df.to_pickle(buffer_pickle, compression=None)
    • 使用这个方法也给我造成了ValueError: I/O operation on closed file.错误,我用buffer = pickle.dumps(df)然后用buffer作为s3 put的Body
    【解决方案3】:

    这对我有用 pandas 0.23.4 和 boto3 1.7.80 :

    bucket='your_bucket_name'
    key='your_pickle_filename.pkl'
    new_df.to_pickle(key)
    s3_resource.Object(bucket, key).put(Body=open(key, 'rb'))
    

    【讨论】:

    • 我想你的意思是用key 代替path,这样它就变成了:s3_resource.Object(bucket, key).put(Body=open(key, 'rb')),对吧?此外,这对我有用,并且在我替换“路径”后没有抛出 I/O operation on a closed file 错误。谢谢!
    【解决方案4】:

    这个解决方案(使用 s3fs)完美而优雅地为我的团队工作:

    import s3fs
    from pickle import dump
    
    fs = s3fs.S3FileSystem(anon=False)
    
    bucket = 'bucket1'
    key = 'your_pickle_filename.pkl'
    
    dump(data, fs.open(f's3://{bucket}/{key}', 'wb'))
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2018-04-25
      • 2019-02-16
      相关资源
      最近更新 更多