使用boto3将CSV文件保存到S3

6

我正在尝试将CSV文件写入并保存到S3中的特定文件夹(已存在)。 这是我的代码:

from io import BytesIO
import pandas as pd
import boto3
s3 = boto3.resource('s3')

d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)

csv_buffer = BytesIO()

bucket = 'bucketName/folder/'
filename = "test3.csv"
df.to_csv(csv_buffer)
content = csv_buffer.getvalue()

def to_s3(bucket,filename,content):
  s3.Object(bucket,filename).put(Body=content)

to_s3(bucket,filename,content)

这是我遇到的错误:

Invalid bucket name "bucketName/folder/": Bucket name must match the regex "^[a-zA-Z0-9.\-_]{1,255}$"

我也尝试过:
bucket = bucketName/folder

并且:

bucket = bucketName
key = folder/
s3.Object(bucket,key,filename).put(Body=content)

有任何建议吗?
4个回答

9
可以使用已有的 .csv 文件通过 upload_file 方法将数据保存到 s3 存储桶中:
import boto3
s3 = boto3.resource('s3')

bucket = 'bucket_name'
filename = 'file_name.csv'
s3.meta.client.upload_file(Filename = filename, Bucket= bucket, Key = filename)

为什么需要两个文件名? - MAC
1
第一个参数是文件目录,第二个参数是要上传的键的名称。(请参阅此处的参数描述:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html) - onur

3

这应该可以正常工作

def to_s3(bucket,filename, content):
    client = boto3.client('s3')
    k = "folder/subfolder"+filename
    client.put_object(Bucket=bucket, Key=k, Body=content)

我应该把内容放在哪里? - HilaD
那么它将如何将内容保存为CSV文件? - HilaD
哦,抱歉,您需要用“file”替换文件名。 - Rakesh

2

这应该可以工作:

bucket = bucketName
key = f"{folder}/{filename}"
csv_buffer=StringIO()
df.to_csv(csv_buffer)
content = csv_buffer.getvalue()
s3.put_object(Bucket=bucket, Body=content,Key=key)

AWS存储桶名称不允许包含斜杠(“/”),这应该是键的一部分。AWS使用斜杠在仪表板中显示“虚拟”文件夹。 由于csv是文本文件,我使用StringIO而不是BytesIO。


你在这里实例化 s3_client 还是 s3_resource? - xxyjoel
1
抱歉,我正在使用boto3客户端: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.put_object - denis_smyslov

0
这对我有效。
import os
import pandas as pd
import boto3
from io import StringIO

from dotenv import load_dotenv
load_dotenv("/path/to/.env", override=True)


def df_to_s3(df, bucket, key):
    # Create a session
    session = boto3.session.Session(profile_name=os.environ.get("AWS_SECRETS_PROFILE_NAME"))
    aws_s3_client = session.client(
        service_name="s3",
        region_name=os.environ.get("AWS_SECRETS_REGION_NAME"),
    )

    # Create a CSV string from the DataFrame
    csv_buffer = StringIO()
    df.to_csv(csv_buffer, index=False)

    # Put the CSV string to S3
    aws_s3_client.put_object(
        Body=csv_buffer.getvalue(),
        Bucket=bucket,
        Key=key
    )
    print(f'Successfully put DataFrame to {bucket}/{key}')

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df_to_s3(df, 'bucketName/folder/', 'test3.csv')

你能详细说明一下吗? - TheTridentGuy supports Ukraine
@TheTridentGuy 很高兴能帮忙:你有什么具体的要求需要我详细解释吗? - Sambbhav Garg
为什么它有效,你做了哪些改变等等。 - TheTridentGuy supports Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接