Gal*_*Gal 26 python amazon-s3 boto
我必须使用Python Boto API在一个存储桶之间移动文件.(我需要它从第一个Bucket中"剪切"文件并在第二个Bucket中"粘贴"它.最好的方法是什么?
**注意:如果我有两个不同的ACCESS KEYS和SECRET KEYS,那有关系吗?
Fre*_*jer 25
我认为boto S3文档可以回答你的问题.
https://github.com/boto/boto/blob/develop/docs/source/s3_tut.rst
通过boto将文件从一个存储桶移动到另一个存储桶实际上是从源到目标的密钥副本,而不是从源中删除密钥.
您可以访问存储桶:
import boto
c = boto.connect_s3()
src = c.get_bucket('my_source_bucket')
dst = c.get_bucket('my_destination_bucket')
Run Code Online (Sandbox Code Playgroud)
并迭代键:
for k in src.list():
# copy stuff to your destination here
dst.copy_key(k.key.name, src.name, k.key.name)
# then delete the source key
k.delete()
Run Code Online (Sandbox Code Playgroud)
另请参阅:是否可以使用s3cmd将所有文件从一个S3存储桶复制到另一个存储桶?
Dav*_*urg 20
如果您使用的是boto3(较新的boto版本),这非常简单
import boto3
s3 = boto3.resource('s3')
copy_source = {
'Bucket': 'mybucket',
'Key': 'mykey'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')
Run Code Online (Sandbox Code Playgroud)
(文件)
与boto应对和删除每个键相比,awscli对我的完成速度快30倍。可能是由于awscli中的多线程。如果您仍然想从python脚本中运行它而不从中调用shell命令,则可以尝试如下操作:
安装awscli python软件包:
sudo pip install awscli
Run Code Online (Sandbox Code Playgroud)
然后就这么简单:
import os
if os.environ.get('LC_CTYPE', '') == 'UTF-8':
os.environ['LC_CTYPE'] = 'en_US.UTF-8'
from awscli.clidriver import create_clidriver
driver = create_clidriver()
driver.main('s3 mv source_bucket target_bucket --recursive'.split())
Run Code Online (Sandbox Code Playgroud)
小智 8
如果您有 2 个具有不同访问凭证的不同存储桶。将凭据相应地存储在 ~/.aws 文件夹下的凭据和配置文件中。
您可以使用以下命令从一个具有不同凭据的存储桶复制对象,然后将对象保存在具有不同凭据的另一个存储桶中:
import boto3
session_src = boto3.session.Session(profile_name=<source_profile_name>)
source_s3_r = session_src.resource('s3')
session_dest = boto3.session.Session(profile_name=<dest_profile_name>)
dest_s3_r = session_dest.resource('s3')
# create a reference to source image
old_obj = source_s3_r.Object(<source_s3_bucket_name>, <prefix_path> + <key_name>)
# create a reference for destination image
new_obj = dest_s3_r.Object(<dest_s3_bucket_name>, old_obj.key)
# upload the image to destination S3 object
new_obj.put(Body=old_obj.get()['Body'].read())
Run Code Online (Sandbox Code Playgroud)
两个存储桶不需要在 ACL 或存储桶策略中彼此具有可访问性。
如果你想
创建已存储在 Amazon S3 中的对象的副本。
然后copy_object是进入 boto3 的方法。
我是怎么做的:
import boto3
aws_access_key_id = ""
aws_secret_access_key = ""
bucket_from = ""
bucket_to = ""
s3 = boto3.resource(
's3',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key
)
src = s3.Bucket(bucket_from)
def move_files():
for archive in src.objects.all():
# filters on archive.key might be applied here
s3.meta.client.copy_object(
ACL='public-read',
Bucket=bucket_to,
CopySource={'Bucket': bucket_from, 'Key': archive.key},
Key=archive.key
)
move_files()
Run Code Online (Sandbox Code Playgroud)