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

2024-10-02 18:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这篇文章对我没有帮助

我需要在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

谢谢


Tags: 文件name文件夹source目标s3bucketfolder
1条回答
网友
1楼 · 发布于 2024-10-02 18:25:30

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

您可以使用以下内容:

import boto3

s3_client = boto3.client('s3')

SOURCE_BUCKET = 'bucket1'
SOURCE_PREFIX = 'folder_name_abc/folder_name_dfr/' # Where is Folder located? (Leave blank if root level, include slash at end if Prefix specified)
FOLDER_TO_COPY = 'folder_name_typ'

DESTINATION_BUCKET = 'bucket2'
DESTINATION_PREFIX = '' # (Leave blank if root level, include slash at end if Prefix specified)

# List objects in source directory
bucket_listing = s3_client.list_objects_v2(Bucket=SOURCE_BUCKET,Prefix=f'{SOURCE_PREFIX}{FOLDER_TO_COPY}/')

for object in bucket_listing['Contents']:
    print(f'Copying from {object['Key']} to {DESTINATION_PREFIX + object['Key'][len(SOURCE_PREFIX):]}')
    s3_client.copy_object(
        CopySource = {'Bucket': SOURCE_BUCKET, 'Key': object['Key']},
        Bucket = DESTINATION_BUCKET,
        Key = DESTINATION_PREFIX + object['Key'][len(SOURCE_PREFIX):] # Remove source prefix, add destination prefix
        )

相关问题 更多 >