1. ホーム
  2. python

[解決済み] boto3を使ってS3オブジェクトをファイルに保存する方法

2022-04-27 04:21:29

質問

私は、"hello world"を新しい ボツ3 AWSのクライアントです。

私のユースケースは、S3からオブジェクトを取得し、それをファイルに保存するという非常にシンプルなものです。

boto 2.Xでは、こんな風にします。

import boto
key = boto.connect_s3().get_bucket('foo').get_key('foo')
key.get_contents_to_filename('/tmp/foo')

ボツ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) .