【问题标题】:copy files from one AWS s3 bucket/folder to another AWS/S3 folder and also keep the deepest sub-folder name by pythons on databricks将文件从一个 AWS s3 存储桶/文件夹复制到另一个 AWS/S3 文件夹,并通过 pythons 在 databricks 上保留最深的子文件夹名称
【发布时间】:2020-06-04 07:58:25
【问题描述】:

我的问题与上一个copy files from one AWS/S3 bucket to another bucket on databricks 有关。 我创建了一个新线程,因为这个问题与上一个问题不同。

这个帖子AWS S3 copy files and folders between two buckets对我没有帮助。

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

我的源 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”?

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

例如, 在源存储桶中:

  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

谢谢

【问题讨论】:

  • Amazon S3 复制命令只会复制一个对象。指定目标时,请提供目标对象(不仅仅是目录)的完整密钥。此外,您似乎在 s3_resource.meta.client.copy 中混淆了资源和客户端 — copy() 方法适用于资源,但您提供的参数看起来像是来自 copy_object(),这是一个客户端调用。我不明白您对“最深文件夹”的要求。
  • “最深的文件夹”意味着我必须保留子文件夹的名称并将它们和其中的文件复制到目的地。请参阅 OP 中的更新。谢谢

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


【解决方案1】:

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

你可以这样使用:

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
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多