将文件从一个AWS S3存储桶/文件夹复制到另一个AWS/S3文件夹,并且通过在Databricks上使用Python代码保留最深层子文件夹名称。

8 浏览
0 Comments

将文件从一个AWS S3存储桶/文件夹复制到另一个AWS/S3文件夹,并且通过在Databricks上使用Python代码保留最深层子文件夹名称。

我的问题与之前的问题在Databricks上将文件从一个AWS/S3存储桶复制到另一个存储桶相关。

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

这篇帖子AWS S3复制两个存储桶之间的文件和文件夹对我没有帮助。

我需要通过Python在Databricks上将一些文件从一个AWS/S3存储桶/文件夹复制到另一个AWS/S3存储桶/文件夹。

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

   源S3存储桶
      文件夹名称1
        文件夹名称2
           文件夹名称3
             文件夹名称4
                 最深层文件夹名称
                      文件1
                      文件2
                       ....
                      文件11500

目标S3存储桶/文件夹结构如下:

   目标S3存储桶
      目标文件夹名称1
        目标文件夹名称2
           目标文件夹名称3
             最深层文件夹名称(此文件夹名称必须与源文件夹名称"最深层文件夹名称"完全相同)
                      文件1
                      文件2
                       ....
                      文件11500

此外,"目标文件夹名称X"都与源文件夹名称不同,源和目标文件夹的深度也不同。但是,源存储桶中最深层的文件夹名称必须保持在目标存储桶中。

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

我尝试了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)

但是,没有文件被复制到目标文件夹中,我该如何保留"最深层文件夹名称"?

更新

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

例如,

在源存储桶中:

  文件夹名称_abc
     文件夹名称_dfr
        文件夹名称_typ # 这些文件夹名称必须保留
            文件1
            文件2
  在目标存储桶中:
       文件夹名称_typ # 这些文件夹名称必须与源文件夹名称完全相同
           文件1
           文件2

谢谢

0
0 Comments

问题的原因是代码中存在语法错误,导致出现了"'type' object is not subscriptable"的错误信息。解决方法是修复代码中的语法错误。

以下是修复后的代码:

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 obj in bucket_listing['Contents']:
    key = obj['Key']
    print(f'Copying from {key} to {DESTINATION_PREFIX + key[len(SOURCE_PREFIX):]}')
    
    s3_client.copy_object(
        CopySource = {'Bucket': SOURCE_BUCKET, 'Key': key},
        Bucket = DESTINATION_BUCKET,
        Key = DESTINATION_PREFIX + key[len(SOURCE_PREFIX):] # Remove source prefix, add destination prefix
    )

修复后的代码将能够正确地将一个AWS S3桶/文件夹中的文件复制到另一个AWS S3文件夹,并保留最深层子文件夹的名称。

0