boto3 + S3 + Heroku / S3のCSVファイルデータを読みjsonで出力する

「boto3 + S3 + Heroku / S3のCSVファイルデータを読みjsonで出力する」のアイキャッチ画像

herokuはファイルを保存する事ができないので、
メモリで読み込んでそれを出力するしかありません
いろいろ調べて見ても該当する記事なかったんで自分で作って見ました

import csv
from io import StringIO
import boto3

s3_client = boto3.resource(
    's3',
    aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
    aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'),
    region_name=os.environ.get('AWS_REGION')
)
bucket = s3_client.Bucket(os.environ.get('AWS_BUCKET_NAME'))


def get_contents(file_id: int, user_id: int):
    # user_idはs3に保存している画像のfilenameを取得するため。
    # なので、s3に保存しているファイル名あればok
    file = find_one(file_id, user_id) 
    obj = bucket.Object(file.filename)

    body = obj.get()['Body'].read()
    body = body.decode('utf-8')
    f = StringIO(body)
    data = []
    for row in reader:
        data.append(row)

    return data

byteデータを作ってその後デコードでstringにして、そのあとはcsvとしてデータを扱えるようにしてます
jsonで送るためにarrayでまとめていますが、中で処理するなら

f = StringIO(body)
reader = csv.reader(f, delimiter=',')
for row in reader:
    print('\t'.join(row))

こんな感じでかけばなんかしらできます
※ 上記のreaderに関するコードは検証していないので動くかわからないです。動かないなら自分で直してください

ちなみにboto3使うの今回が初めてだったのですが、
思ったよりも簡単にまとめれるし、
Herokuで使う場合でもデータ引っ張ってきて、それを返してあげるとかもできるのでかなり重宝できそうですね

目次
  1. 参考記事

参考記事

More complex APIs: Upload and Download Files with Flask
Boto 3 Documentation
Listing contents of a bucket with boto3
Python AWS Boto3: How do i read files from S3 Bucket?
Boto3 で S3 のオブジェクトを操作する(高レベルAPIと低レベルAPI)
Google Cloud Visionを使ってみようとしたときの「TypeError: Object of type ‘bytes’ is not JSON serializable」
Python csv string to array