it-swarm.com.ru

Запись файла рассола в корзину s3 в AWS

Я пытаюсь записать файл данных pandas как файл рассола в корзину s3 в AWS. Я знаю, что могу записать фрейм данных 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(), но безуспешно.

3
himi64

Я нашел решение, нужно вызвать BytesIO в буфер для файлов рассылки вместо StringIO (которые предназначены для файлов CSV). 

pickle_buffer = BytesIO()
s3_resource = boto3.resource('s3')

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

Кроме того, вам не нужно конвертировать в CSV. Метод pickle.dumps возвращает байтовый объект. смотрите здесь: 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)
3
Mostafa Shabani

у меня это работало с пандами 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'))
1
Limsanity82