繁体   English   中英

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

[英]Transfer files from one S3 bucket to another S3 bucket using python 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

如果有人可以帮助我在上述脚本中进行更改,这将非常有帮助。

谢谢

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

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

如果您的脚本在本地服务器上运行,并且想要访问两个存储桶以将文件从一个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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM