2016-02-01 24 views
10

boto3'te, bir nesnenin içeriğini bir dosya tanıtıcısına kopyalarken, get_contents_to_file eşdeğeri var mı? Ben boto3 bir eşdeğer bulamadıboto3 içinde get_contents_to_file öğesine eşdeğer

from tempfile import TemporaryFile 
key = code_that_gets_key() 

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

: Ben bir S3 nesnesi key varsa

Boto olarak, beraber geçici bir dosyaya içeriğini kopyalayabilirsiniz.

get_contents_to_filename kullanımını download_file ile değiştirebildim. Ancak, bu dosya adını verdiğim durumu kapsar. Bu durumda, dosya tanıtıcısını argüman olarak sunmak istiyorum.

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

boto3 bunu yapmanın daha iyi bir yolu var mı:

Şu anda, kod aşağıdaki gibi vücut üzerinde yineleme tarafından boto3 çalışmaya alabilirim?

+0

'tmp_file.name' öğesini 'download_file()' konumuna geçiremiyor musunuz? – helloV

+0

@helloV Bu durumda bir dosya ismi olan ['NamedTemporaryFile'] (https://docs.python.org/2/library/tempfile.html#tempfile.NamedTemporaryFile) kullanabilirim. Bunun iyi bir fikir olup olmadığından emin değilim, çünkü 'download_file' yöntemi aynı dosya için yeni bir dosya tanıtıcısı açacaktır. Genel olarak, tüm dosya tanıtıcıları dosya adlarına sahip değildir (örneğin, 'StringIO',' TemporaryFile'). – Alasdair

+1

Bu [download_fileobj] (https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.download_fileobj) ne için değil mi? –

cevap

7

V1.4.0 itibariyle tam olarak ne istediğinizi yapan bir download_fileobj işlevi yoktur. resmi belgeler gereğince:

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

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

operasyon örneğin yanı da bucket resource ve s3 client geçerli:

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

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

Whoops, 's3 = boto3.resource ('s3')' olmalıdır. Mea culpa, dokümanlar kısa bir süre sonra güncellenmelidir. Ayrıca bu işlemin [s3 client] (https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.download_fileobj) ve [Object resource] kaynaklarında mevcut olduğunu da belirtmek gerekir. (https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Object.download_fileobj) de. –

+0

@JordonPhillips Teşekkürler! Alıntıyı yaparken bunu fark etmeliydim ... –

+0

Teşekkürler Peter ve @JordonPhillips. Benim durumumda, özellikle aradığım nesne versiyonuydu. – Alasdair

0

doğru cevap TemporaryFile yerine NamedTemporaryFile kullanmak olacaktır: Burada

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

Daha docs: https://docs.python.org/2/library/tempfile.html

+0

Bu, verdiğim örnek için çalışıyor, ama aradığım genel çözüm değil. Yorumlarda söylediğim gibi, tüm dosya tanıtıcılarının dosya adları yoktur. – Alasdair

0

Peter cevabın doğru olduğunu, ancak bunun şu anda çok dikkat etmek istiyorum AWS, en önemlisi AWS Lambda olan boto3 1.4'e sahip değildir. Taze yüklemeler olduğunu

boto3.__version__ >= '1.4.0' 

kontrol etmek ve kütüphane değilse yükseltme emin olun üzerinde

Bu anında yükseltme engellemez, ancak durumda kod koşuyoruz ediyoruz. Umarım bu yakında çözülecek ve bu moot olacaktır.

İlgili konular