使用python boto3

时间:2017-12-19 19:00:31

标签: python-3.x amazon-s3 amazon boto3

我想将文件从一个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

如果有人可以帮助我对上述脚本进行更改,那将非常有用。

由于

2 个答案:

答案 0 :(得分:0)

您可以使用下面的代码在像您一样的分层文件夹结构中将文件从一个存储桶传输到另一个存储桶。在这里,您不必定义任何特定的键或文件夹结构,代码将解决此问题:

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()来清理 源存储桶。

答案 1 :(得分:0)

如果您的脚本在本地服务器上运行,并且想要访问两个存储桶以将文件从一个s3存储桶传输到另一个存储桶,则可以按照以下代码进行操作。这将在“ bucket1”中创建文件副本到“ bucket2”中的“ sample”文件夹中“。

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()