web-dev-qa-db-fra.com

Écriture d'un fichier pickle dans un compartiment s3 dans AWS

J'essaie d'écrire un pandas dataframe en tant que fichier pickle dans un compartiment s3 dans AWS. Je sais que je peux écrire un dataframe new_df En tant que csv dans un compartiment s3 en tant que suit:

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

J'ai essayé d'utiliser le même code que ci-dessus avec to_pickle() mais sans succès.

13
himi64

J'ai trouvé la solution, j'ai besoin d'appeler BytesIO dans le tampon pour les fichiers pickle au lieu de StringIO (qui sont pour les fichiers 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())
6
himi64

Suite à votre réponse, vous n'avez pas besoin de convertir en csv. La méthode pickle.dumps renvoie un obj d'octet. voir ici: 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)
12
Mostafa Shabani

cela a fonctionné pour moi avec pandas 0.23.4 et 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
Limsanity82