Azure SDK for PythonのBlob Storage Clientを使ってpandasのDataFrameをcsv形式でBlobストレージにアップロードする

pandasのDataFrameをCSV形式でBlob Storageにアップロードする場面が結構あったので、こちらの記事を参考にさせてもらいました。

sinyblog.com

こちらも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の作成方法は今回は割愛します。こちらのドキュメントを参考にし、ストレージアカウントを用意してください。

docs.microsoft.com

docs.microsoft.com

pandasのDataFrameをCSV形式でBlob Storageにアップロード

まずはAzure Blob Storage Clientのライブラリパッケージをpip経由でダウンロード

$ pip install azure-storage-blob

次に、ストレージアカウントの接続文字列を取得します。接続文字列はAzureのポータル上などで取得することができます。 f:id:rnakamine:20201013144754p:plain 今回は取得した接続文字列を環境変数にセットしていきます。

$ 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)

最終的なサンプルコードはこちらです。

github.com

上記のプログラムを実行し、Blob StorageにCSVファイルがアップロードされているのを確認できました。 f:id:rnakamine:20201011172407p:plain

ちなみに、アップデートはできないみたいなので同じ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で同じことをしようとすると少し工夫が必要となりそうです。

参考

docs.microsoft.com