Acessando arquivos no Amazon S3
Objetivo: Acessar arquivos contidos no serviço de armazenamento da Amazon Web Services via python.
Sobre o serviço:
A rotina abaixo contempla uma situação de identificar e avaliar alguns arquivos que você possa ter no S3.
Considera-se que as credenciais de acesso já estejam corretamente setadas na sua máquina.
from osgeo import gdal
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import boto3
import io
1. Acessar bucket do S3 por meio do boto3 client
session = boto3.Session(profile_name='default')
s3_client = session.client('s3')
s3_bucket_name = 'nome_do_bucket'
s3 = boto3.resource('s3')
my_bucket = s3.Bucket(s3_bucket_name)
2.1 Listar todos os arquivos, sem filtros
bucket_list = []
for file in my_bucket.objects.filter(Prefix='path_do_bucket_e_arquivos'):
file_name = file.key
bucket_list.append(file.key) # lista arquivos com nomes e paths
Em outro cenário, no qual tenho diferentes tipos de arquivos e gostaria de separá-los:
2.2 Listar arquivos e filtrar (Tenho .csv e .tif)
bucket_csv = []
bucket_tif = []
for file in my_bucket.objects.filter(Prefix='path_do_bucket_e_arquivos'):
file_name = file.key
if file_name.split("/")[-1].endswith(".csv"):
bucket_csv.append(file.key) # listar com nomes de arquivos e paths
else:
bucket_tif.append(file.key)
.csv
2.2.1. Lê os arquivos do s3 –> lista de data frames
list_dfs = []
for file in bucket_csv:
obj = s3.Object(s3_bucket_name, file)
data = obj.get()['Body'].read()
list_dfs.append(pd.read_csv(io.BytesIO(data)))
.tif
Nesse caso, tenho apenas 1 raster, vou apenas abrir e plotar
2.2.2 usando vsis3_streaming/ (file system handler)
ds = gdal.Open(str('/vsis3_streaming/' + s3_bucket_name + '/' + bucket_tif[0]))
array = ds.GetRasterBand(1).ReadAsArray()
plt.imshow(array)
plt.colorbar() # add a color scale
plt.title('Título do raster')
ds = None