2016-02-01 7 views
10

boto3 में, get_contents_to_file के समतुल्य है, जो किसी ऑब्जेक्ट की सामग्री को फ़ाइल संभाल में कॉपी करता है?boto3 में get_contents_to_file के समतुल्य

Boto में, यदि मैं एक S3 वस्तु key है, मैं सामग्री एक अस्थायी फ़ाइल के लिए के साथ कॉपी कर सकते हैं:

from tempfile import TemporaryFile 
key = code_that_gets_key() 

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

मैं boto3 में एक समान नहीं मिली है।

मैं get_contents_to_filename के download_file के साथ उपयोग करने में सक्षम हूं। हालांकि, वह उस मामले को शामिल करता है जहां मैं फ़ाइल नाम प्रदान करता हूं। इस मामले में, मैं फ़ाइल हैंडल को तर्क के रूप में प्रदान करना चाहता हूं।

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

वहाँ boto3 में यह करने के लिए एक बेहतर तरीका है:

वर्तमान में, मैं कोड शरीर पर पुनरावृत्ति के रूप में निम्नानुसार द्वारा boto3 में काम करने के लिए मिल सकता है?

+0

क्या आप 'tmp_file.name' को' download_file() 'पास नहीं कर सकते? – helloV

+0

@helloV इस मामले में मैं ['नामांकित समकालीन फ़ाइल '] का उपयोग कर सकता हूं (https://docs.python.org/2/library/tempfile.html#tempfile.NamedTemporaryFile), जिसमें फ़ाइल नाम है। मुझे यकीन नहीं है कि यह एक अच्छा विचार है, क्योंकि 'download_file' विधि एक ही फ़ाइल के लिए एक नई फ़ाइल हैंडल खोल देगा। आम तौर पर, सभी फ़ाइल हैंडल में फ़ाइल नाम नहीं होते हैं (उदा। 'स्ट्रिंगियो', 'अस्थायी फ़ाइल')। – 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 resource और s3 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') होना चाहिए। मी 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

@ जोर्डन फिलिप्स धन्यवाद! मुझे लगता है कि मुझे यह देखना चाहिए था कि अंश कब करते हैं ... –

+0

धन्यवाद पीटर और @ जोर्डन फिलिप्स। मेरे मामले में यह ऑब्जेक्ट संस्करण था जिसे मैं विशेष रूप से ढूंढ रहा था। – 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

पीटर जवाब सही है, लेकिन मैं ध्यान दें कि वर्तमान में बहुत चाहते हैं एडब्ल्यूएस के पास बोटो 3 1.4 तैनात नहीं है, विशेष रूप से एडब्ल्यूएस लैम्ब्डा।

इस मक्खी पर उन्नयन करने से रोक नहीं है, लेकिन मामले में आप कोड runing रहे हैं ताजा इंस्टॉल किए जाने कि

boto3.__version__ >= '1.4.0' 

की जाँच करें और पुस्तकालय उन्नयन नहीं तो यह सुनिश्चित कर लें पर। उम्मीद है कि यह जल्द ही तय हो जाएगा और यह मंथन होगा।

संबंधित मुद्दे