【问题标题】:saving csv file to s3 using boto3使用boto3将csv文件保存到s3
【发布时间】:2020-12-23 15:26:36
【问题描述】:

我正在尝试将 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)

有什么建议吗?

【问题讨论】:

    标签: python csv amazon-s3


    【解决方案1】:

    也可以使用upload_file 和现有的 .csv 文件保存到 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)
    

    【讨论】:

    【解决方案2】:

    这应该可以工作

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

    【讨论】:

    • 内容应该放在哪里?
    • 那么它将如何将内容保存为 csv 文件?
    • 抱歉,您需要用文件替换文件名。
    【解决方案3】:

    这应该可行:

    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 存储桶名称不允许有斜杠(“/”),它应该是 Key 的一部分。 AWS 使用斜杠在仪表板中显示“虚拟”文件夹。 由于 csv 是一个文本文件,我使用 StringIO 而不是 BytesIO

    【讨论】:

    猜你喜欢
    • 2015-06-05
    • 2021-07-13
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2016-02-10
    • 2020-04-14
    相关资源
    最近更新 更多