将文件从一个AWS s3存储桶/文件夹复制到另一个AWS/s3文件夹,并通过pythons将最深的子文件夹名称保留在DataRicks上

将文件从一个AWS s3存储桶/文件夹复制到另一个AWS/s3文件夹,并通过pythons将最深的子文件夹名称保留在DataRicks上,python,amazon-web-services,amazon-s3,Python,Amazon Web Services,Amazon S3,我的问题与上一个问题有关。 我创建了一个新的线程,因为这个问题与前一个不同 这篇文章对我没有帮助 我需要在DataRicks上用python将一些文件从一个AWS/S3 bucket/文件夹复制到另一个AWS/S3 bucket文件夹 我的源S3存储桶/文件夹如下: source_s3_bucket folder_name1 folder_name2 folder_name3 folder_name4

我的问题与上一个问题有关。 我创建了一个新的线程,因为这个问题与前一个不同

这篇文章对我没有帮助

我需要在DataRicks上用python将一些文件从一个AWS/S3 bucket/文件夹复制到另一个AWS/S3 bucket文件夹

我的源S3存储桶/文件夹如下:

   source_s3_bucket
      folder_name1
        folder_name2
           folder_name3
             folder_name4
                 deepest_folder_name
                      file1
                      file2
                       ....
                      file11500
目标s3存储桶/文件夹:

   destination_s3_bucket
      dest_folder_name1
        dest_folder_name2
           dest_folder_name3
             deepest_folder_name (this folder name must be exactly same as the source one "deepest_folder_name")
                      file1
                      file2
                       ....
                      file11500
此外,dest_folder_nameX与源文件夹都不同,而且源文件夹和目标文件夹的深度也不同。但是,源bucket中最深的文件夹名必须保留在目标bucket中

所有文件必须完全复制并保持相同的名称

我尝试过Python 3编码:

import boto3
s3 = boto3.client('s3')
s3_resource = boto3.resource('s3')
for key in s3.list_objects(Bucket=source_bucket, Prefix=source_prefix)['Contents']:
    files = key['Key']
    copy_source = {'Bucket': source_bucket,'Key': files}
    s3_resource.meta.client.copy(CopySource=copy_source, Bucket=dest_bucket, Key=dest_prefix)
但是,没有文件被复制到目标文件夹,我如何才能保留最深的文件夹名称

更新
最深的文件夹意味着我必须保留该层子文件夹的名称,并将它们和位于其中的文件复制到目标

比如说,, 在源存储桶中:

  folder_name_abc
     folder_name_dfr
        folder_name_typ # this folder names must be kept
            file1
            file2

  In destination bucket:
       folder_name_typ # this folder names must be exactly same as the source
           file1
           file2

谢谢

棘手的部分是操作对象关键点的“路径”部分

您可以使用以下内容:

进口boto3 s3\u client=bot3.客户端's3' SOURCE_BUCKET='bucket1' SOURCE\u PREFIX='folder\u name\u abc/folder\u name\u dfr/'文件夹在哪里?如果是根级别,则保留为空;如果指定了前缀,则在末尾包含斜杠 文件夹\u至\u副本='文件夹\u名称\u类型' 目的地_桶='bucket2' DESTINATION_PREFIX=如果是根级别,则保留为空;如果指定了前缀,则在末尾包含斜杠 列出源目录中的对象 bucket_listing=s3_client.list_objects_v2Bucket=SOURCE_bucket,Prefix=f'{SOURCE_Prefix}{FOLDER_TO_COPY}/' 对于bucket_清单['Contents']中的对象: printf'正在从{object['Key']}复制到{DESTINATION_PREFIX+object['Key']][lenSOURCE_PREFIX:}' s3\u client.copy\u对象 CopySource={'Bucket':SOURCE_Bucket,'Key':object['Key']}, Bucket=目的地\ Bucket, Key=DESTINATION_PREFIX+object['Key'][lenSOURCE_PREFIX:]删除源前缀,添加目标前缀
amazons3copy命令将只复制一个对象。指定目标时,为目标对象提供完整密钥,而不仅仅是目录。另外,在s3_resource.meta.client.copy中,您似乎混淆了资源和客户机-copy方法在资源上工作,但您提供的参数看起来像来自copy_对象,这是一个客户机调用。我不明白你对最深文件夹的要求。最深文件夹意味着我必须保留子文件夹的名称,并将它们和其中的文件复制到目标。请参阅OP中的更新。谢谢