如何实现仅复制S3源桶指定文件夹内的文件到目标桶指定文件夹
实现S3指定文件夹复制到目标文件夹
以下是修改后的代码,可实现仅复制源桶指定文件夹内的文件到目标桶的指定文件夹:
import boto3 from sagemaker import get_execution_role role = get_execution_role() print(role) sts_client = boto3.client('sts') assumed_role_object=sts_client.assume_role( RoleArn=role, RoleSessionName="AssumeRoleSession1" ) print(assumed_role_object) # 获取临时凭证 credentials=assumed_role_object['Credentials'] # 初始化S3资源 s3_resource=boto3.resource( 's3', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'], ) # 配置参数 src_bucket = "source_bucket" dest_bucket = "destination_bucket" # 指定源文件夹前缀(末尾加斜杠避免匹配类似前缀的对象) src_folder_prefix = "source_folder/" # 指定目标文件夹前缀 dest_folder_prefix = "target_folder/" # 仅遍历源桶中指定文件夹下的对象 for obj in s3_resource.Bucket(src_bucket).objects.filter(Prefix=src_folder_prefix): # 跳过虚拟文件夹本身(S3中文件夹是前缀,无实际内容) if obj.key == src_folder_prefix: continue # 构造复制源 copy_source = { 'Bucket': src_bucket, 'Key': obj.key } # 生成目标Key:替换源前缀为目标前缀 dest_key = obj.key.replace(src_folder_prefix, dest_folder_prefix, 1) print(f"复制 {obj.key} 到 {dest_key}") s3_resource.meta.client.copy(copy_source, dest_bucket, dest_key)
关键修改说明:
- 过滤源文件夹对象:使用
objects.filter(Prefix=src_folder_prefix)替代objects.all(),只获取指定前缀下的对象,末尾加斜杠确保只匹配该文件夹下的内容,不会误匹配如source_folder_other/这类前缀相似的路径。 - 跳过虚拟文件夹:S3中的文件夹是虚拟的,会以空对象形式存在(key为文件夹前缀),通过
if obj.key == src_folder_prefix: continue跳过这类无意义的空对象。 - 生成目标路径:通过
replace方法将源路径的前缀替换为目标文件夹前缀,确保文件复制到指定的目标目录下,1参数表示只替换第一次出现的前缀,避免路径中其他相同字符串被误替换。
内容的提问来源于stack exchange,提问作者Mark Andrew
相关产品推荐
相关产品推荐

