我正在尝试用亚马逊网络服务的新boto3客户端创建一个"hello world“。
我的用例相当简单:从S3获取对象并将其保存到文件中。
在boto 2.X中,我会这样做:
import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')
在boto 3中。我找不到一种干净的方法来做同样的事情,所以我手动迭代了"Streaming“对象:
import boto3
key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get()
with open('/tmp/my-image.tar.gz', 'w') as f:
chunk = key['Body'].read(1024*8)
while chunk:
f.write(chunk)
chunk = key['Body'].read(1024*8)
或
import boto3
key = boto3.resource('s3').Object('fooo', 'docker/my-image.tar.gz').get()
with open('/tmp/my-image.tar.gz', 'w') as f:
for chunk in iter(lambda: key['Body'].read(4096), b''):
f.write(chunk)
它工作得很好。我想知道有没有什么“原生”boto3函数可以做同样的事情?
发布于 2015-04-15 04:15:45
最近在Boto3中有一个自定义,它对此(以及其他事情)有所帮助。它目前在低级S3客户端上公开,可以这样使用:
s3_client = boto3.client('s3')
open('hello.txt').write('Hello, world!')
# Upload the file to S3
s3_client.upload_file('hello.txt', 'MyBucket', 'hello-remote.txt')
# Download the file from S3
s3_client.download_file('MyBucket', 'hello-remote.txt', 'hello2.txt')
print(open('hello2.txt').read())
这些函数将自动处理文件的读/写,以及对大文件进行并行的分块上传。
请注意,s3_client.download_file
不会创建目录。可以将其创建为pathlib.Path('/path/to/file.txt').parent.mkdir(parents=True, exist_ok=True)
。
发布于 2016-02-13 00:27:28
boto3现在有一个比客户端更好的接口:
resource = boto3.resource('s3')
my_bucket = resource.Bucket('MyBucket')
my_bucket.download_file(key, local_filename)
这本身并不比公认的答案中的client
好得多(尽管文档中说它在失败时重试上传和下载方面做得更好),但考虑到资源通常更符合人体工程学(例如,s3 bucket和object资源比客户端方法更好),这确实允许您停留在资源层,而不必陷入困境。
Resources
通常可以用与客户端相同的方式创建,它们接受所有或大部分相同的参数,并将它们转发给内部客户端。
发布于 2017-01-24 23:26:25
# Preface: File is json with contents: {'name': 'Android', 'status': 'ERROR'}
import boto3
import io
s3 = boto3.resource('s3')
obj = s3.Object('my-bucket', 'key-to-file.json')
data = io.BytesIO()
obj.download_fileobj(data)
# object is now a bytes string, Converting it to a dict:
new_dict = json.loads(data.getvalue().decode("utf-8"))
print(new_dict['status'])
# Should print "Error"
https://stackoverflow.com/questions/29378763
复制相似问题