如何将内存值中的字典数据直接写入csv文件中的s3 bucket,而无需写入文件然后将其上载

2024-10-01 00:29:08 发布

您现在位置:Python中文网/ 问答频道 /正文

import boto3
import pandas as pd

BUCKET_NAME = ''
ACCESS_KEY_ID = ''
ACCESS_SECRET_KEY = ''
Fraudfilekey = 'fraud_CT_ID_IM_NO/ CT_PROFILE_One_to_Many_Mapping /yyyy=2021/mm=02/dd=05/2021_02_05_CT_TEST.csv'

d = {"A" : ["John","Deep","Julia","Kate","Sandy"],
                     "MonthSales" : [25,30,35,40,45]}
df = pd.DataFrame(d)

s3 = boto3.client('s3', region_name='ap-south-1', aws_access_key_id=ACCESS_KEY_ID,
                  aws_secret_access_key=ACCESS_SECRET_KEY)
def write_to_s3_oneim_to_onect(df):
    s3.put_object(Body=df, Bucket=BUCKET_NAME, Key=Fraudfilekey)

write_to_s3_oneim_to_onect(df)

如何将字典值直接写入s3存储桶,我得到了下面的错误体 raise ParamValidationError(report=report.generate_report()) botocore.exceptions.ParamValidationError:参数验证失败: 参数体的类型无效,值:A MonthSales

注意:我想在csv文件中标题列为IM No、CT ID


Tags: tokeynameimportreportiddfsecret
1条回答
网友
1楼 · 发布于 2024-10-01 00:29:08

几乎没有办法。一种方法是使用BytesIO作为文件的内存缓冲区:

import io

def write_to_s3_oneim_to_onect(df):
    bytes_io = io.BytesIO()
    df.to_csv(bytes_io)
    s3.put_object(Body=bytes_io.getvalue(), 
                  Bucket=BUCKET_NAME, 
                  Key=Fraudfilekey)

另一种方法是使用pandas支持的s3fs。这需要您安装s3fs并设置AWScredetnails以供其使用。但一旦设置完毕,写入S3将是:

def write_to_s3_oneim_to_onect(df):
    df.to_csv(f"s3://{BUCKET_NAME}/{Fraudfilekey}")

相关问题 更多 >