首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用boto3将S3对象保存到文件中

如何使用boto3将S3对象保存到文件中
EN

Stack Overflow用户
提问于 2015-04-01 05:17:59
回答 5查看 186.1K关注 0票数 152

我正在尝试用亚马逊网络服务的新boto3客户端创建一个"hello world“。

我的用例相当简单:从S3获取对象并将其保存到文件中。

在boto 2.X中,我会这样做:

代码语言:javascript
运行
复制
import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')

在boto 3中。我找不到一种干净的方法来做同样的事情,所以我手动迭代了"Streaming“对象:

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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函数可以做同样的事情?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-15 04:15:45

最近在Boto3中有一个自定义,它对此(以及其他事情)有所帮助。它目前在低级S3客户端上公开,可以这样使用:

代码语言:javascript
运行
复制
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)

票数 243
EN

Stack Overflow用户

发布于 2016-02-13 00:27:28

boto3现在有一个比客户端更好的接口:

代码语言:javascript
运行
复制
resource = boto3.resource('s3')
my_bucket = resource.Bucket('MyBucket')
my_bucket.download_file(key, local_filename)

这本身并不比公认的答案中的client好得多(尽管文档中说它在失败时重试上传和下载方面做得更好),但考虑到资源通常更符合人体工程学(例如,s3 bucketobject资源比客户端方法更好),这确实允许您停留在资源层,而不必陷入困境。

Resources通常可以用与客户端相同的方式创建,它们接受所有或大部分相同的参数,并将它们转发给内部客户端。

票数 67
EN

Stack Overflow用户

发布于 2017-01-24 23:26:25

代码语言:javascript
运行
复制
# 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"
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29378763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档