【Python】pandasのDataFrame等からs3にアップロードする方法まとめ?

【Python】pandasのDataFrame等からs3にアップロードする方法まとめ?


# aws # pandas # python

毎回boto3のドキュメントが読みにくすぎるせいで詰まりがちなのでメモっておきます。

他にも色々方法はありそうですが、代表的な方法はこんなものですかね…?

環境

python==3.8.1

pandas==1.0.2

boto3==1.12.23

Boto3を使う(一度ローカルに保存する)

import boto3

local_path = 'local_path'
df.to_csv(local_path)

s3 = boto3.resource('s3')

bucket = s3.Bucket('bucket_name')
bucket.upload_file(local_path, 's3_key')

良く見る一般的な使い方かなと思います。Pickleだろうと何だろうと、パスさえ指定すればいいので汎用的ですよね。 特にデータサイエンス界隈ではメモリ上のみにデータを展開することよりも、一度ローカルに保存することが多いのでこのような方法がネットを見ても沢山あります。

一度ローカルにファイルを展開するのでファイル名の配慮や完了後のデータ削除等地味に面倒なことが多いです。

Boto3を使う(ローカルには保存しない)

PandasのDataFrame(等)をcsvとして保存する

import boto3
s3 = boto3.resource('s3')

s3_obj = s3_connection.Object('bucket_name', 's3_key')
s3_obj.put(Body=df.to_csv(None).encode('utf_8_sig'))

Pandasは高機能すぎて使いこなすのは大変ですが、本当に何でも出来る感じですね…。

  1. df.to_csvの引数にNoneを指定することでstr型として結果が帰る
  2. str型なのでそのままだとデフォルトの文字コードが適用されるので、str.encode()で任意の文字コードを指定する

というような感じです。便利。

pickleを保存する

import pickle
import boto3

s3 = boto3.resource('s3')

s3_obj = s3_connection.Object('bucket_name', 's3_key')
s3_obj.put(Body=pickle.dumps(data))

pickleもjsonと同じようにdumpsを使うとファイルに保存ではなく結果が帰ってくるためそれを使うだけです。

 

1つのことをやるのにかなりの数のAPIが用意されているのでどれを使うのが最適なのか未だに良く分かってないですが、まあ保存は出来ているので…。。

df.to_csvの引数で直接s3を指定

これは自分が試せていないのですがどうやら以下のような感じで出来るみたいです。本当に高機能だな…。

※s3fsのインストールが必要です。

import pandas as pd
# 読み込み
df = pd.read_csv('s3://pandas-test/tips.csv')

# 書き込み
df.to_csv('s3://pandas-test/tips.csv')

以下参考ページです。