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