从同一存储桶中另一个子文件夹中的 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])
我想将文件从子文件夹复制到同一个 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])