NO IMAGE

【Python, AWS】Python でAWS s3から複数のcsvを読み込む

AWS NO IMAGE

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’に変更

.複数の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から読み込まずに、実行できます。

関連記事

NO IMAGE
最新情報をチェックしよう!

AWSの最新記事8件