【问题标题】:Rename files while copying files between cross account s3 buckets在跨账户 s3 存储桶之间复制文件时重命名文件
【发布时间】:2021-07-07 23:11:44
【问题描述】:

我正在跨账户 s3 存储桶之间复制多个 parquet 文件。当我将它们复制到目标存储桶时,我想重命名文件。

import boto3
s3_client = boto3.client('s3')
s3_resource = boto3.resource('s3')

bucket = 'sourcebucket'
folder_path = 'source_folder/'

resp = s3_client.list_objects(Bucket=bucket, Prefix=folder_path)
keys = []
for obj in resp['Contents']:
    keys.append(obj['Key'])


for key in keys:
    copy_source ={
        'Bucket': 'sourcebucket',
        'Key': key
    }
    file_name = key.split('/')[-1]
     s3_file = 'dest_folder/'+'xyz'+file_name
    bucketdest = s3_resource.Bucket('destinationbucket')
    bucketdest.copy(copy_source,s3_file,ExtraArgs={'GrantFullControl':'id = " "'})

这是我尝试过的。我可以在目标存储桶中看到具有新名称的文件,但它们没有实际数据。

谢谢!

【问题讨论】:

  • 你确定源文件不为空吗?您是否有权访问目标存储桶中的文件?
  • S3 是否将对象显示为零长度?

标签: python amazon-web-services amazon-s3 boto3 parquet


【解决方案1】:

您的代码对我来说工作得很好! (但是,我没有使用 ExtraArgs 运行它,因为我没有 ID。)

当我在桶之间复制对象时,我使用的规则是:

  • 如果可能,其他帐户“拉”文件
  • 如果“推送”文件另一个帐户,我设置ExtraArgs={'ACL':'bucket-owner-full-control'}

我怀疑这个小改动会影响你的对象的内容。

顺便说一句,使用任一客户端方法资源方法可能是个好主意。混合使用它们会导致代码混乱和潜在问题。

所以,你可以使用类似的东西:

客户端方法:

response = s3_client.list_objects(Bucket=bucket, Prefix=source_prefix)

for object in response['Contents']:
    copy_source ={
        'Bucket': source_bucket,
        'Key': object['Key']
    }
    s3_client.copy_object(
        Bucket = target_bucket,
        Key = 'dest_folder/' + 'xyz' + key.split('/')[-1],
        CopySource = copy_source,
        ACL = 'bucket-owner-full-control'
    )

或者你可以使用:

资源方式:

for object in s3_resource.Bucket(source_bucket).objects.Filter(Prefix=source_prefix):
    copy_source ={
        'Bucket': source_bucket,
        'Key': object.key
    }
    s3_resource.Bucket(target_bucket).copy(
        CopySource = copy_source,
        Key = 'dest_folder/' + 'xyz' + key.split('/')[-1],
        ExtraArgs={'ACL':'bucket-owner-full-control'}
    )

(警告:我没有测试那些 sn-ps。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 2020-03-11
    • 2021-07-03
    • 2021-07-17
    • 2014-06-15
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多