AWS s3に保存したデータを引っ張てきて、コードを走らせたいときに便利なコードです。
サンプルコード
import boto3
import pandas as pd
from io import StringIO
import streamlit as st
# @st.cache(allow_output_mutation=True)
def s3_data():
s3 = boto3.resource('s3')
ACCESS_KEY = '××××××××××××××××××××××'
SECRET_KEY = '××××××××××××××××××××××'
client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
paginator = client.get_paginator('list_objects')
pageresponse = paginator.paginate(Bucket="××××××××××")
readers = pd.DataFrame()
for pageobject in pageresponse:
for file in pageobject["Contents"]:
obj = client.get_object(Bucket="××××××××××", Key=file["Key"])
content = obj['Body'].read().decode('shift-jis')
reader = pd.read_csv(StringIO(content))
readers = readers.append(reader)
return readers
コード解説
https://qiita.com/masamichiueta/items/fa4094683637131b46f6
基本的には、添付のURLコードを参照しています。
変更しているのは、以下の2点だけです
1.decodeを’shift-jis’に変更
2.複数のcsvを読み込めるようにアレンジ
変更点の詳細は以下の通りです。
1.decodeを’shift-jis’に変更
content = obj['Body'].read().decode('shift-jis')
2.複数のcsvを読み込めるようにアレンジ
この記事と同じように書き換えています。
readers = pd.DataFrame()
空のDataFrameを用意する
reader = pd.read_csv(StringIO(content))
readers = readers.append(reader)
return readers
空のDataFrame(readers)に読み込んだcsv(reader)をappendで追加していき、最後にreadersにまとめて、出力させています。
おまけ1(使い回せるように関数化)
def s3_data():
"""
#コードは省略
"""
return readers
defで関数化しておくことで、使い回しできます。
この関数を実行したいコードと共に保存しておき、以下のコードを実行したいコードに書いておけば、使い回しできます。コードを分ける方法は別途、解説します。
from aws_s3_reader import s3_data
df = s3_data()
おまけ2(Streamlitでの応用)
@st.cache(allow_output_mutation=True)
def s3_data():
"""
"""
return readers
“@st.cache(allow_output_mutation=True)”を書いておくと、Streamlitでwebアプリ化した際に何度もS3から読み込まずに、実行できます。