pandasのDataFrameをCSV形式でBlob Storageにアップロードする場面が結構あったので、こちらの記事を参考にさせてもらいました。
こちらもAzure SDK for PythonのBlob Storage Clientを使っているようだったのですが、バージョンがv2.1を使用していたので、今回はv12.0の方を使用してBlob StorageにpandasのDataFrameのデータをアップロードしていきます。
環境
- python 3.8.1
- pandas 1.1.3
- azure-storage-blob 12.5.0
サンプルデータの作成
適当にフルーツの値段を並べたようなDataframeを作成します。
import pandas as pd df = pd.DataFrame( {'fruits': ['banana', 'orange', 'apple'], 'price': [100, 150, 170]}) print(df) # fruits price # 0 banana 100 # 1 orange 150 # 2 apple 170
blob storgeの作成方法は今回は割愛します。こちらのドキュメントを参考にし、ストレージアカウントを用意してください。
pandasのDataFrameをCSV形式でBlob Storageにアップロード
まずはAzure Blob Storage Clientのライブラリパッケージをpip経由でダウンロード
$ pip install azure-storage-blob
次に、ストレージアカウントの接続文字列を取得します。接続文字列はAzureのポータル上などで取得することができます。 今回は取得した接続文字列を環境変数にセットしていきます。
$ export AZURE_STORAGE_CONNECTION_STRING="<接続文字列>"
os.getenv()
メソッドを使用して、先ほど環境変数に格納した接続文字列をプログラム側で取得し、
BlobServiceClientクラスのインスタンスを作成します。from_connection_string()
クラスメソッドを使用して、ストレージアカウントの接続文字列を指定することができます。
import os import pandas as pd from azure.storage.blob import BlobServiceClient connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING') blob_service_client = BlobServiceClient.from_connection_string()
get_blob_client()
メソッドを使用して、BlobClientオブジェクトの参照を取得します。
引数container
で操作したいblob storageのコンテナを指定、引数blob
でblobの名前を指定します。ここではsample.csv
としてCSVファイルをアップロードしたいので、下記のように指定します。
blob_client = blob_service_client.get_blob_client(container='sample', blob='sample.csv')
最後に先ほど作成したpandasのDataframeをCSV形式に変換し、upload_blob()
メソッドを使用して、ファイルをアップロードします。
output = df.to_csv(index=False)
blob_client.upload_blob(output)
最終的なサンプルコードはこちらです。
上記のプログラムを実行し、Blob StorageにCSVファイルがアップロードされているのを確認できました。
ちなみに、アップデートはできないみたいなので同じblob名をuploadしようとすると
azure.core.exceptions.ResourceExistsError: The specified blob already exists. RequestId:27a9d8cd-f01e-0019-64a9-9fac5b000000 Time:2020-10-11T08:32:08.5781790Z ErrorCode:BlobAlreadyExists Error:None
といったエラーが返ってきます。
Blob Storage Clientのv2.1だと、create_blob_from_text()
メソッドなどを使用してuploadするのですが、
こちらはblobがあればupdate、無ければcreateみたいな動きをしているので、v12.0で同じことをしようとすると少し工夫が必要となりそうです。