当前位置: 首页 > 知识库问答 >
问题:

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

岳亮
2023-03-14

我正在尝试为AWS的新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')

在博托3。我找不到一种干净的方法来做同样的事情,所以我手动迭代“流”对象:

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函数可以完成相同的任务?

共有3个答案

楮景明
2023-03-14

对于那些想要模拟set_contents_from_string如boto2方法的人,您可以尝试

import boto3
from cStringIO import StringIO

s3c = boto3.client('s3')
contents = 'My string to save to S3 object'
target_bucket = 'hello-world.by.vor'
target_file = 'data/hello.txt'
fake_handle = StringIO(contents)

# notice if you do fake_handle.read() it reads like a file handle
s3c.put_object(Bucket=target_bucket, Key=target_file, Body=fake_handle.read())

对于Python3:

在python3中,StringIO和cStringIO都消失了。使用StringIO导入,如:

from io import StringIO

要支持这两个版本,请执行以下操作:

try:
   from StringIO import StringIO
except ImportError:
   from io import StringIO
贡英华
2023-03-14

boto3现在拥有比客户端更好的界面:

resource = boto3.resource('s3')
my_bucket = resource.Bucket('MyBucket')
my_bucket.download_file(key, local_filename)

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

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

包和泰
2023-03-14

最近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\u client.download\u file不会创建目录。它可以创建为pathlib.Path('/Path/to/file.txt').parent.mkdir(parents=True,exist\u ok=True)

 类似资料:
  • 问题内容: 我正在尝试使用适用于AWS的新boto3客户端做一个“ hello world” 。 我的用例非常简单:从S3获取对象并将其保存到文件中。 在boto 2.XI中,它应该是这样的: 在boto 3中。我找不到一种干净的方法来做同样的事情,所以我手动遍历了“ Streaming”对象: 要么 而且效果很好。我想知道是否有任何“本机” boto3函数可以完成相同的任务? 问题答案: Bot

  • 问题内容: 在boto 2中,可以使用以下方法写入S3对象: Key.set_contents_from_string() Key.set_contents_from_file() Key.set_contents_from_filename() Key.set_contents_from_stream() 是否有boto 3等效项?将数据保存到S3上存储的对象的boto3方法是什么? 问题答案:

  • 问题内容: 我想将一个对象保存到文件中,然后轻松地从文件中读取它。作为一个简单的示例,可以说我有以下3d数组: 是否有一个简单的Ruby API,无需编程解析器即可解释文件中的数据,就可以用来实现此目的?在示例中,我给出了一个简单的例子,但是随着对象变得越来越复杂,使对象持久化变得很烦人。 问题答案: 参见元帅:http : //ruby- doc.org/core/classes/Marshal

  • 问题内容: 我目前利用以下内容将文件上传到S3: 上面的方法工作正常,但我想直接将a保存到S3以从应用程序中删除几秒钟,但是我不知道如何执行此操作?这是我当前将图像保存到文件中的方式: 有没有一种方法可以直接以流的形式直接写入Amazon S3,如果可以,有人可以显示示例吗? 另外,这是个好主意吗?如果它容易出错,我将继续使用当前方法。任何建议表示赞赏。 问题答案: 以下(或类似的东西)应该可以正

  • 我正在使用PDFbox在我的代码中合并两个pdf文件,然后我想将结果(合并文件)存储到AWS s3桶中。我试图直接将pdf文件存储到s3,而不在我的系统中本地保存,但我无法找到任何方法来做到这一点。 我的代码合并两个pdf- 我不想在我的服务器上制作一个文件,而是想直接把它放在s3上,我如何修改这个代码来上载到s3桶。上面的代码只是我卡住的一部分。我使用创建的文件一和文件二。 整个想法是合并两个文

  • 我需要上传网址到一个s3桶,我正在使用boto3。我想我有一个解决方案,这个问题:如何保存S3对象到一个文件使用boto3,但当我去下载文件,我仍然得到错误。目标是让他们下载为音频文件,而不是URL。我的代码: 我的问题是,我需要更改什么,以便将文件作为音频文件而不是URL保存在s3中?