如何修改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
相关产品推荐
相关产品推荐

