You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python将API返回的CSV文件直接保存至Amazon S3存储桶(无需本地存储)

如何直接将API返回的CSV上传至Amazon S3(无需本地存储)?

嘿,作为Python新手能想到跳过本地文件直接传S3,这个思路超棒!其实boto3完全支持直接上传内存中的内容,不用先存本地。我给你一步步拆解怎么改代码,保证易懂:

第一步:确保依赖包已安装

首先得安装boto3(AWS的Python SDK)和requests,打开终端跑这个命令:

pip install boto3 requests

第二步:配置AWS凭证

要操作S3,你需要让Python能访问你的AWS账号权限。最简单的方式是用AWS CLI配置:

  1. 安装AWS CLI(如果没装的话)
  2. 在终端运行aws configure,然后按照提示输入:
    • Access Key ID
    • Secret Access Key
    • 默认区域(比如us-east-1,或者你S3桶所在的区域)
    • 默认输出格式(直接回车用json就行)

如果是在AWS云服务(比如EC2、Lambda)上运行,直接给实例/角色加S3上传权限就行,不用手动输凭证~

第三步:修改代码实现直接上传

下面是完整的代码,我加了详细注释,你替换成自己的S3桶名就能用:

import requests
import boto3

def main():
    # 1. 定义API请求信息
    api_url = "https://api0.solar.sheffield.ac.uk/pvlive/v3/pes/10?start=2021-01-01T00:00:00&end=2021-07-06T00:00:00&data_format=csv"
    request_headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Accept-Encoding': 'gzip, deflate',
    }

    # 2. 发送请求获取CSV内容(直接存在内存里,不碰本地文件)
    api_response = requests.get(api_url, headers=request_headers)
    api_response.raise_for_status()  # 这行很重要!如果API请求失败会直接抛出异常,方便你排查问题

    # 3. 初始化S3客户端
    s3_client = boto3.client('s3')

    # 4. 上传到S3的关键参数
    your_bucket_name = "替换成你的S3桶名称"
    s3_file_path = "myFile.csv"  # 这是文件在S3里的名称/路径,比如想放文件夹里就写"csv_data/myFile.csv"

    # 5. 执行上传
    try:
        s3_client.put_object(
            Bucket=your_bucket_name,
            Key=s3_file_path,
            Body=api_response.content,  # 直接传内存里的CSV字节内容
            ContentType='text/csv'  # 可选,但设置后S3会正确识别文件类型,浏览器打开不会乱码
        )
        print(f"搞定!CSV已经上传到S3:s3://{your_bucket_name}/{s3_file_path}")
    except Exception as upload_error:
        print(f"上传出问题啦:{str(upload_error)}")

if __name__ == "__main__":
    main()

关键知识点解释(给新手划重点)

  • api_response.content:这是API返回的原始字节数据,我们直接把它传给S3的Body参数,完全不用写本地文件。
  • put_object方法:boto3的这个方法专门用来上传对象,支持直接传字节流,完美适配我们的需求。
  • ContentType='text/csv':虽然是可选参数,但强烈建议加上——这样别人在S3控制台点击文件时,浏览器会正确解析成CSV表格,而不是直接下载或者显示一堆乱码。

新手常见坑提示

  • 权限问题:如果上传时报AccessDenied,一定要检查你的AWS账号有没有s3:PutObject权限,可以去IAM控制台给用户/角色加对应的权限策略。
  • 区域问题:如果你的S3桶在特定区域,初始化客户端时可以指定区域,比如s3_client = boto3.client('s3', region_name='eu-west-1'),避免跨区域上传的延迟。
  • 异常处理:代码里的raise_for_status()和try-except能帮你快速定位问题,比如API请求超时、S3桶不存在这些情况,都能给出明确提示。

内容的提问来源于stack exchange,提问作者WindSwept

火山引擎 最新活动