2017-05-18 78 views
1

我有以下代碼如何將S3存儲桶中的圖像文件直接讀入內存?

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
import numpy as np 
import boto3 
s3 = boto3.resource('s3', region_name='us-east-2') 
bucket = s3.Bucket('sentinel-s2-l1c') 
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2') 
object.download_file('B01.jp2') 
img=mpimg.imread('B01.jp2') 
imgplot = plt.imshow(img) 
plt.show(imgplot) 

和它的作品。但是它首先將文件下載到當前目錄中的問題。是否可以直接在RAM中讀取文件並將其解碼爲圖像?

回答

3

我想建議在tempfile模塊中使用Python的NamedTemporaryFile。它創建的文件關閉時將被刪除臨時文件(感謝@NoamG)

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
import numpy as np 
import boto3 
import tempfile 

s3 = boto3.resource('s3', region_name='us-east-2') 
bucket = s3.Bucket('sentinel-s2-l1c') 
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2') 
tmp = tempfile.NamedTemporaryFile() 

with open(tmp.name, 'wb') as f: 
    object.download_fileobj(f) 
    img=mpimg.imread(tmp.name) 
    # ...Do jobs using img 
+0

這應該可以正常工作,但是在引擎蓋下,一個真實的文件被創建並且一旦關閉就會被銷燬。 – NoamG

+0

@NoamG謝謝!我誤解了'tempfile'模塊的工作原理。更新了我的答案。 –

1

我會建議使用io module直接讀取到內存中的文件,而無需使用臨時文件都沒有。

例如:

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
import numpy as np 
import boto3 
import io 

s3 = boto3.resource('s3', region_name='us-east-2') 
bucket = s3.Bucket('sentinel-s2-l1c') 
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2') 

file_stream = io.StringIO() 
object.download_fileobj(file_stream) 
img = mpimg.imread(file_stream) 
# whatever you need to do 

你也可以使用io.BytesIO如果你的數據是二進制的。

0
object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2') 
img_data = object.get().get('Body').read() 
+6

感謝您使用此代碼段,這可能會提供一些即時幫助。通過說明爲什麼這是一個很好的解決方案的問題,可以大大提高(https://meta.stackexchange.com/q/114762)其教育價值,並且可以使未來的讀者更加有用,但不完全相同的問題。請編輯您的答案以添加解釋,並指出適用的限制和假設。 – GrumpyCrouton

0

通過在imread()中指定文件格式,可以流式傳輸圖像。

import boto3 
from io import BytesIO 
import matplotlib.image as mpimg 
import matplotlib.pyplot as plt 

resource = boto3.resource('s3', region_name='us-east-2') 
bucket = resource.Bucket('sentinel-s2-l1c') 

image_object = bucket.Object('tiles/10/S/DG/2015/12/7/0/B01.jp2') 
image = mpimg.imread(BytesIO(image_object.get()['Body'].read()), 'jp2') 

plt.figure(0) 
plt.imshow(image.T) 
相關問題