我正在尝试使用适用于AWS的新boto3客户端做一个“ hello world” 。
我的用例非常简单:从S3获取对象并将其保存到文件中。
在boto 2.XI中,它应该是这样的:
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函数可以完成相同的任务?
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)。
s3_client.download_file
pathlib.Path('/path/to/file.txt').parent.mkdir(parents=True, exist_ok=True)