将文件从一个AWS s3 bucket/文件夹复制到另一个AWS/s3文件夹,并在数据块上保留Python最深的子文件夹



我的问题与之前在数据块上将文件从一个AWS/S3存储桶复制到另一个存储桶有关。我创建了一个新的线程,因为这个问题与前一个不同。

这篇文章AWS S3在两个桶之间复制文件和文件夹对我没有帮助。

我需要在databricks上通过python将一些文件从一个AWS/S3 bucket/文件夹复制到另一个AWS/AS3 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"与源文件夹都不同,源文件夹和目标文件夹的深度也不同。但是,源存储桶中最深的文件夹名称必须保留在目标存储桶中。

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

我已经尝试过做python3编码:

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)

但是,没有文件复制到目标文件夹,以及如何保留"deepest_folder_name"?

UPDATE"最深的文件夹"意味着我必须保留该层的子文件夹的名称,并将它们和其中的文件复制到目的地。

例如,在源桶中:

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

感谢

棘手的部分是操纵对象Keys的"路径"部分。

你可以使用这样的东西:

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
)

最新更新