如何使用Python将本地文件夹中的CSV文件上传至S3桶指定文件夹
使用Python将本地CSV文件上传至Amazon S3指定文件夹
前置准备
- 安装AWS SDK for Python(boto3):
pip install boto3 - 配置AWS凭证:
- 推荐方式:在本地创建
~/.aws/credentials文件(Linux/macOS)或C:\Users\<你的用户名>\.aws\credentials(Windows),内容格式:[default] aws_access_key_id = 你的访问密钥ID aws_secret_access_key = 你的秘密访问密钥 - 也可通过环境变量
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY配置,禁止在代码中硬编码凭证,存在泄露风险。
- 推荐方式:在本地创建
核心实现代码
以下代码会遍历本地指定文件夹下的所有CSV文件,将它们上传到S3存储桶的指定路径中:
import os import boto3 from botocore.exceptions import ClientError def upload_csvs_to_s3(local_folder, s3_bucket, s3_target_prefix): # 初始化S3客户端 s3 = boto3.client('s3') # 遍历本地文件夹中的CSV文件 for filename in os.listdir(local_folder): if filename.endswith('.csv'): local_file_path = os.path.join(local_folder, filename) # 构造S3对象键:目标前缀+文件名,S3的"文件夹"本质是键的前缀 s3_object_key = os.path.join(s3_target_prefix, filename).replace('\\', '/') try: # 执行上传 s3.upload_file(local_file_path, s3_bucket, s3_object_key) print(f"成功上传: {filename} -> s3://{s3_bucket}/{s3_object_key}") except ClientError as e: print(f"上传失败 {filename}: {e.response['Error']['Message']}") # 替换为你的实际参数 LOCAL_CSV_FOLDER = "/path/to/your/local/csv/folder" S3_BUCKET_NAME = "your-s3-bucket-name" S3_TARGET_FOLDER = "target/folder/in/s3" # 不需要开头的斜杠 # 启动上传 upload_csvs_to_s3(LOCAL_CSV_FOLDER, S3_BUCKET_NAME, S3_TARGET_FOLDER)
关键细节
- S3没有真正的"文件夹",所谓文件夹是对象键的前缀。比如设置
S3_TARGET_FOLDER = "data/2024/csv",上传后的文件键会是data/2024/csv/file.csv,控制台会显示为层级结构。 - Windows系统下
os.path.join会生成反斜杠\,需要替换为正斜杠/,符合S3对象键的格式要求。 - 异常处理覆盖了权限不足、桶不存在、网络故障等常见问题,便于排查错误。
可选优化
- 批量加速:使用
boto3.s3.transfer.S3Transfer配置多线程,适合大量文件上传场景。 - 避免重复上传:上传前调用
s3.head_object()检查目标路径是否已有相同文件。 - 指定存储类别:通过
ExtraArgs={'StorageClass': 'STANDARD_IA'}设置低频访问存储,降低成本。
内容的提问来源于stack exchange,提问作者Buddhadeb Mondal
相关产品推荐
相关产品推荐

