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