Укажите каталог на S3 от Amazon

#python #amazon-web-services #amazon-s3

#python #amazon-веб-сервисы #amazon-s3

Вопрос:

Я новичок в сервисах AWS. Я всегда использовал приведенный ниже код для вычисления NDVI для изображений, которые были расположены в каталоге.

 path = r'images'
dirContents = os.listdir(path)

for file in dirContents:
    if os.path.isdir(file):
        subDir = os.listdir(file)
        
        # Assuming only two files in each subdirectory, bands 4 and 8 here
        if "B04" in subDir[0]:
            band4 = rasterio.open(subDir[0])
            band8 = rasterio.open(subDir[1])
        else:
            band4 = rasterio.open(subDir[1])
            band8 = rasterio.open(subDir[0])

        red = band4.read(1).astype('float32')
        nir = band8.read(1).astype('float32')

        #compute the ndvi
        ndvi = (NIR.astype(float) - RED.astype(float)) / (NIR RED)

        profile = red.meta
        profile.update(driver='GTiff')
        profile.update(dtype=rasterio.float32)

        with rasterio.open(outfile, 'w', **profile) as dst:
            dst.write(ndvi.astype(rasterio.float32))
 

Теперь все необходимые изображения находятся в папке Amazon S3. Как мне заменить строки ниже?

 path = r'images'
dirContents = os.listdir(path)
 

Ответ №1:

Amazon S3 не является файловой системой. Вам нужно будет использовать разные команды, чтобы:

  • Перечислите содержимое корзины / пути
  • Загрузите файлы в локальное хранилище
  • Затем получите доступ к файлам в локальном хранилище

Вы можете использовать boto3 AWS SDK для Python для доступа к объектам, хранящимся в S3.

Например:

 import boto3

s3_resource = boto3.resource('s3')

# List objects
objects = s3_resource.Bucket('your-bucket').objects.Filter(Prefix='images/')

# Loop through each object
for object in objects:
  s3_resource.Object(object.bucket_name, object.key).download_file('local_filename')
  # Do something with the file here
 

Ответ №2:

Если вы новичок в AWS, вы также можете рассмотреть библиотеку libcloud. Это библиотека, которая позволяет вам использовать различные облачные решения с унифицированным API. Для решений для хранения данных, которые вы могли бы сделать (код отсюда):

 from libcloud.storage.types import Provider
from libcloud.storage.providers import get_driver

client = driver(StoreProvider.S3)
s3 = client(aws_id, aws_secret)

container = s3.get_container(container_name='name')
objects = s3.list_container_objects(container, prefix='path')

# Download a file
s3.download_object(objects[0], '/path/to/download')
 

Некоторые вещи, на которые следует обратить внимание:

  • Файлы хранятся в корзине (контейнере) S3. Хотя сегменты имеют плоскую иерархию, вам разрешено использовать ключевые имена, такие как ‘path / subpath / file1’, для организации файлов в папках.
  • Вам необходимо подтвердить подлинность доступа к корзине. В приведенном выше коде вы делаете это, предоставляя идентификатор и секрет.