从同一存储桶中另一个子文件夹中的 s3 子文件夹复制文件

Copy file from s3 subfolder in another subfolder in same bucket

我想将文件从子文件夹复制到同一个 s3 存储桶中的另一个子文件夹。我在 SO 中阅读了很多问题,最后我得到了这段代码。它有一个问题,当我 运行 它工作时,但它不只复制文件,它复制包含文件的文件夹到想要的目标我有文件但在文件夹(root ).如何只复制该子文件夹中的文件?

XXXBUCKETNAME:
    -- XXXX-input/  # I want to copy from here
    -- XXXX-archive/ # to here


import boto3
from botocore.config import Config
s3 = boto3.resource('s3', config=Config(proxies={'https': getProperty('Proxy', 'Proxy.Host')}))
bucket_obj = s3.Bucket('XXX')
destbucket = 'XXX'

jsonfiles = []
for obj in bucket_obj.objects.filter(Delimiter='/', Prefix='XXXX-input/', ):
    if obj.key.endswith('json'):
        jsonfiles.append(obj.key)
for k in jsonfiles:
    if k.split("_")[-1:][0] == "xxx.txt":
        dest = s3.Bucket(destbucket)
        source= { 'Bucket' : destbucket, 'Key': k}
        dest.copy(source, "XXXX-archive/"+k)

它给出:

XXXBUCKETNAME:
    -- XXXX-input/
    -- XXXX-archive/
        -- XXXX-input/file.txt

我要:

XXXBUCKETNAME:
    -- XXXX-input/
    -- XXXX-archive/
        -- file.txt

在 S3 中确实没有任何“文件夹”。如 documentation 中所述,有桶和对象。 UI 看起来好像有文件夹,但对象的关键是整个路径。因此,如果你想复制一个项目,你将需要解析它的键并以不同的方式构建目标键,以便它具有相同的前缀(路径)但以不同的值结尾。

In Amazon S3, buckets and objects are the primary resources, and objects are stored in buckets. Amazon S3 has a flat structure instead of a hierarchy like you would see in a file system. However, for the sake of organizational simplicity, the Amazon S3 console supports the folder concept as a means of grouping objects. It does this by using a shared name prefix for objects (that is, objects have names that begin with a common string). Object names are also referred to as key names.

在您的代码中,您正在提取每个对象的键,这意味着键已经包含完整的“路径”,即使实际上并没有路径。因此,您需要将键拆分为 / 字符,然后获取结果列表中的最后一个元素并将其附加为文件名:

dest.copy(source, "XXXX-archive/" + k.split("/")[-1])