2016-02-01 11 views
10

boto3には、オブジェクトの内容をファイルハンドルにコピーするget_contents_to_fileに相当するものがありますか?私はboto3で同等のものを発見していないboto3のget_contents_to_fileに相当します。

from tempfile import TemporaryFile 
key = code_that_gets_key() 

with TemporaryFile() as tmp_file: 
    key.get_contents_to_file(key, tmpfile) 

:私はS3オブジェクトkeyを持っている場合

はのbotoでは、私は一時ファイルに内容をコピーすることができます。

get_contents_to_filenameの使用をdownload_fileに置き換えることができました。ただし、これはファイル名を指定する場合に適用されます。この場合、引数としてファイルハンドルを指定したいと思います。

現在、私は、コードは次のように身体を反復処理によりboto3で動作するように取得することができます:

with TemporaryFile() as tmp_file: 
    body = key.get()['Body'] 
    for chunk in iter(lambda: body.read(4096), b''): 
     filehandle.write(chunk) 

はboto3でこれを行うには良い方法はありますか?

+0

'tmp_file.name'を' download_file() 'に渡せませんか? – helloV

+0

@helloVこの場合、ファイル名を持つ['NamedTemporaryFile'](https://docs.python.org/2/library/tempfile.html#tempfile.NamedTemporaryFile)を使用できます。 'download_file'メソッドは同じファイルのために新しいファイルハンドルを開くので、それは良い考えかどうか分かりません。一般に、すべてのファイルハンドルにファイル名(例えば、 'StringIO'、' TemporaryFile')があるわけではありません。 – Alasdair

+1

これは[download_fileobj](https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.download_fileobj)の目的ではありませんか? –

答えて

7

V1.4.0のとおり正確に何をしたいんdownload_fileobj機能があります。正式な文書ごとに:

import boto3 
s3 = boto3.resource('s3') 
bucket = s3.Bucket('mybucket') 
obj = bucket.Object('mykey') 

with open('filename', 'wb') as data: 
    obj.download_fileobj(data) 

の動作は、たとえば、同様bucket resources3 clientでもご覧になれます。

import boto3 
s3 = boto3.resource('s3') 
bucket = s3.Bucket('mybucket') 

with open('filename', 'wb') as data: 
    bucket.download_fileobj('mykey', data) 
+0

おっと、 's3 = boto3.resource( 's3')'にする必要があります。 Mea culpa、ドキュメントはまもなく更新する必要があります。この操作は[s3クライアント](https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.download_fileobj)と[オブジェクトリソース]で利用できることにも注意してください。 (https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Object.download_fileobj)も同様です。 –

+0

@JordonPhillipsありがとう!私は抜粋をするときにそれを見つけたはずだと思う。 –

+0

ありがとうピーターと@JordonPhillips。私の場合、それは私が特に探していたオブジェクトバージョンでした。 – Alasdair

0

正解はTemporaryFileの代わりにNamedTemporaryFileを使用することです:ここ

with NamedTemporaryFile() as tmp_file: 
    file_name = tmp_file.name # This is what you are looking for 

その他のドキュメント:https://docs.python.org/2/library/tempfile.html

+0

これは、私が与えた例では機能しますが、私が探している一般的な解決策ではありません。コメントで述べたように、すべてのファイルハンドルにファイル名があるわけではありません。 – Alasdair

0

ピーターの答えは正しいですが、私はその現在、多くの点に注意してくださいしたいと思いますAWSのboto3 1.4は導入されていません。特にAWS Lambdaです。

これはその場でアップグレードするのを防ぐことはできませんが、場合にあなたが新規インストール上のコードをruningているが

boto3.__version__ >= '1.4.0' 

いることを確認し、ない場合は、ライブラリをアップグレードしてください。うまくいけば、これはすぐに修正され、これは疑問になるでしょう。

関連する問題