将pickle文件写入AWS中的s3存储桶

时间:2018-03-05 21:50:26

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

我正在尝试将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()相同的代码,但没有成功。

4 个答案:

答案 0 :(得分:8)

除此之外,您还不需要转换为csv。 pickle.dumps方法返回一个字节obj。见这里:https://docs.python.org/3/library/pickle.html

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

答案 1 :(得分:6)

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

import io
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())

答案 2 :(得分:2)

这对我来说适用于熊猫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,path).put(Body=open(key, 'rb'))

答案 3 :(得分:0)

这个解决方案(使用 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'))