You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用boto3向S3存储桶中的CSV文件写入数据的方法

操作S3存储桶中CSV文件的方案

S3的对象是不可变实体,不支持直接追加内容。你需要先将CSV文件下载到本地(或内存中),追加新数据后再上传覆盖原文件,或者上传为新文件(如果需要保留历史版本)。

方案1:下载到本地文件处理后上传

这种方式适合数据量较大,或者需要保留本地临时文件的场景:

import boto3
import csv
import os

# 初始化S3客户端
s3 = boto3.client('s3')
bucket_name = 'your-bucket-name'
s3_file_key = 'path/to/your/file.csv'
local_file_path = 'temp.csv'

# 1. 从S3下载CSV文件到本地
s3.download_file(bucket_name, s3_file_key, local_file_path)

# 2. 追加新用户信息到本地CSV
new_user_data = [
    ['user4', 'user4@example.com', '28'],
    ['user5', 'user5@example.com', '30']
]

with open(local_file_path, 'a', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(new_user_data)

# 3. 将修改后的文件上传回S3,覆盖原文件
s3.upload_file(local_file_path, bucket_name, s3_file_key)

# 可选:删除本地临时文件
os.remove(local_file_path)

方案2:在内存中处理(无需本地文件)

如果数据量不大,推荐用内存流处理,避免磁盘IO:

import boto3
import csv
from io import StringIO, BytesIO

# 初始化S3客户端
s3 = boto3.client('s3')
bucket_name = 'your-bucket-name'
s3_file_key = 'path/to/your/file.csv'

# 1. 从S3读取文件到内存字符串流
response = s3.get_object(Bucket=bucket_name, Key=s3_file_key)
csv_content = response['Body'].read().decode('utf-8')
csv_stream = StringIO(csv_content)

# 2. 读取原有内容,追加新用户数据
reader = csv.reader(csv_stream)
rows = list(reader)

new_user_data = [
    ['user4', 'user4@example.com', '28'],
    ['user5', 'user5@example.com', '30']
]
rows.extend(new_user_data)

# 3. 将新内容写入内存字节流,上传回S3
output_stream = StringIO()
writer = csv.writer(output_stream)
writer.writerows(rows)

bytes_stream = BytesIO(output_stream.getvalue().encode('utf-8'))
s3.put_object(Bucket=bucket_name, Key=s3_file_key, Body=bytes_stream)

注意事项

  • 如果CSV文件有表头,确保追加的新数据列数和表头一致,避免格式错误。
  • 若有并发操作该文件的场景,可能出现覆盖冲突,建议结合S3版本控制或分布式锁(比如用DynamoDB实现)。
  • 针对超大CSV文件,内存处理可能出现资源不足,建议用分段读写或本地文件方案。

内容的提问来源于stack exchange,提问作者kabir.987

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:27:19