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

tuwxkamq  于 2023-01-11  发布在  其他
关注(0)|答案(7)|浏览(176)

我正在尝试将pickle文件形式的panda Dataframe 写入AWS中的s3 bucket。我知道我可以将 Dataframe new_df以csv形式写入s3 bucket,如下所示:

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()中使用上面的相同代码,但是没有成功。

68bkxrlz

68bkxrlz1#

根据你的回答,你不需要转换成csv。pickle.dumps方法返回一个byte obj。https://docs.python.org/3/library/pickle.html

import boto3
import pickle

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

3lxsmp7m2#

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

import io
import boto3

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

4xy9mtcn3#

这对我的Pandas0.23.4和boto3 1.7.80有效:

bucket='your_bucket_name'
key='your_pickle_filename.pkl'
new_df.to_pickle(key)
s3_resource.Object(bucket, key).put(Body=open(key, 'rb'))
vyswwuz2

vyswwuz24#

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

2izufjch5#

这对以前的回答作了一些澄清:

import pandas as pd
import boto3

# make df
df = pd.DataFrame({'col1:': [1,2,3]})

# bucket name
str_bucket = 'bucket_name'
# filename
str_key_file = 'df.pkl'
# bucket path
str_key_bucket = dir_1/dir2/{str_key_file}'

# write df to local pkl file
df.to_pickle(str_key_file)

# put object into s3
boto3.resource('s3').Object(str_bucket, str_key_bucket).put(Body=open(str_key_file, 'rb'))
dpiehjr4

dpiehjr46#

从Tarek Atwan刚刚出版的书《用Python进行时间序列分析》中,我学到了这个方法:

import pandas as pd
            df = pd.DataFrame(...)

            df.to_pickle('s3://mybucket/pklfile.bz2',
                   storage_options={
                       'key': AWS_ACCESS_KEY,
                       'secret': AWS_SECRET_KEY
                   }
            )

我觉得更像Python。

sirbozc5

sirbozc57#

我已经找到了最好的解决方案-只需要升级Pandas和安装s3 fs:

pip install s3fs==2022.8.2
pip install install pandas==1.1.5

bucket,key='mybucket','path'

df.to_pickle(f"{bucket}{key}.pkl.gz", compression='gzip')

相关问题