使用python boto3将文件从一个S3存储桶传输到另一个S3存储桶

pobjuy32  于 2023-03-13  发布在  Python
关注(0)|答案(2)|浏览(319)

我想将文件从一个S3存储桶路径(比如B1/x/*)传输到另一个S3存储桶(比如B2/y/*),其中B1和B2是两个S3存储桶,x和y是其中分别包含csv文件的文件夹。
我已经写了下面的脚本来做这件事。但我得到错误'object_list'没有定义。此外,我不确定它是否会执行传输文件的工作或没有。
参考以下脚本:

import boto3
s3 = boto3.client("s3")
# list_objects_v2() give more info

more_objects=True
found_token = True
while more_objects :
  if found_token :
    response= s3.list_objects_v2(
      Bucket="B1", 
      Prefix="x/",
      Delimiter="/")
  else:   
    response= s3.list_objects_v2(
      Bucket="B1",
      ContinuationToken=found_token,
      Prefix="x/",
      Delimiter="/")
  # use copy_object or copy_from
  for source in object_list["Contents"]:
    raw_name = source["Key"].split("/")[-1] 
    new_name = "new_structure/{}".format(raw_name)
    s3.copy_from(CopySource='B1/x')      
    # Now check there is more objects to list
    if "NextContinuationToken" in response:
      found_token = response["NextContinuationToken"]
      more_objects = True
    else:
      more_objects = False

如果有人能帮我修改上面的脚本,那将非常有帮助。
谢谢

ie3xauqp

ie3xauqp1#

你可以用下面的代码把文件从一个存储桶传输到另一个存储桶,在这里你不需要定义任何特定的键或文件夹结构,代码会处理这些:

import boto3
s3 = boto3.resource('s3')
src_bucket = s3.Bucket('bucket_name')
dest_bucket = s3.Bucket('bucket_name')
dest_bucket.objects.all().delete()  #this is optional clean bucket
for obj in src_bucket.objects.all():
    s3.Object('dest_bucket', obj.key).put(Body=obj.get()["Body"].read())

如果要在文件移动后清除源存储桶,可以在代码末尾使用src_bucket.objects.all().delete()来清除源存储桶。

xbp102n0

xbp102n02#

如果您的脚本运行在本地服务器,并希望访问两个桶传输文件从一个s3桶到另一个,你可以按照下面的代码。这将创建一个副本的文件在“bucket1”到“sample”文件夹在“bucket2”。

import boto3
s3 = boto3.resource('s3')
src_bucket = s3.Bucket('bucket1')
dest_bucket = s3.Bucket('bucket2')
for obj in src_bucket.objects.all():
    filename= obj.key.split('/')[-1]
    dest_bucket.put_object(Key='sample/' + filename, Body=obj.get()["Body"].read())

如果你想在从源存储桶复制后删除文件,下面的代码可以在复制后的循环中使用。

s3.Object(src_bucket, obj.key).delete()

相关问题