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

如何修改Python方法实现本地文件夹文件批量上传至S3

解决方案

要实现本地文件夹所有文件上传到S3,核心是遍历本地目录的所有文件,为每个文件生成对应的S3存储键,再逐个调用上传方法。以下是修改后的完整代码:

import boto3
import os
from botocore.exceptions import NoCredentialsError

# 初始化S3客户端
session_root = boto3.Session(region_name='eu-west-3', profile_name='my_profile')
s3_client = session_root.client('s3')

prefix_key = "S3_folder/"
local_path = "/home/local_folder/"
bucket_name = "bucket_S3"

def upload_to_aws(local_file, bucket, s3_file):
    try:
        s3_client.upload_file(local_file, bucket, s3_file)
        print(f"Upload Successful: {local_file} -> {s3_file}")
        return True
    except FileNotFoundError:
        print(f"The file was not found: {local_file}")
        return False
    except NoCredentialsError:
        print("Credentials not available")
        return False

def upload_folder_to_aws(local_folder, bucket, s3_prefix):
    # 遍历本地文件夹下的所有文件(包括子文件夹)
    for root, dirs, files in os.walk(local_folder):
        for file in files:
            # 拼接本地文件的完整路径
            local_file_path = os.path.join(root, file)
            # 计算相对于本地根文件夹的路径,保证S3目录结构和本地一致
            relative_path = os.path.relpath(local_file_path, local_folder)
            # 转换路径分隔符为S3兼容的/
            s3_file_key = os.path.join(s3_prefix, relative_path).replace("\\", "/")
            # 调用单个文件上传方法
            upload_to_aws(local_file_path, bucket, s3_file_key)

# 执行批量上传
upload_folder_to_aws(local_path, bucket_name, prefix_key)

关键修改说明:

  • 引入os模块:用于遍历文件系统、处理路径逻辑。
  • 新增upload_folder_to_aws函数:
    • 用os.walk递归遍历本地文件夹,覆盖所有子目录中的文件。
    • 通过os.path.relpath获取文件相对根目录的路径,确保S3上的目录结构和本地完全匹配。
    • 替换路径分隔符为/:适配S3的存储键格式(Windows系统默认用\,需转为S3支持的/)。
  • 优化原上传函数的打印信息:显示具体文件的上传路径,便于排查问题。

可选调整(仅上传当前目录文件,不含子文件夹):

如果不需要上传子文件夹内容,可以改用以下简化版的批量上传函数:

def upload_folder_to_aws(local_folder, bucket, s3_prefix):
    for file_name in os.listdir(local_folder):
        local_file_path = os.path.join(local_folder, file_name)
        if os.path.isfile(local_file_path):
            s3_file_key = os.path.join(s3_prefix, file_name).replace("\\", "/")
            upload_to_aws(local_file_path, bucket, s3_file_key)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:52:54