概要
Azure Blob Storage にあるファイルをローカルにダウンロードするPythonプログラムです。
実行環境
macOS Monterey 12.3.1
python 3.8.12
azure cli 2.41.0
BLOB情報
ストレージアカウントの接続文字列の取得
$ az storage account show-connection-string --name [StorageAccountName] --resource-group [ResourceGroupName] -o table
ConnectionString
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=[StorageAccountName];AccountKey=[StorageAccountKey1]
今回の対象とするBLOBの取得
# BLOBのリスト
$ az storage blob list --account-name [StorageAccountName] --container-name partnercenter -o table
Name Blob Type Blob Tier Length Content Type Last Modified Snapshot
--------------------------------------------------------------------------------------------- ----------- ----------- -------- ------------------------ ------------------------- ----------
billing-data BlockBlob Hot 2022-10-24T16:06:44+00:00
billing-data/TestExport BlockBlob Hot 2022-10-24T16:06:44+00:00
billing-data/TestExport/20220901-20220915 BlockBlob Hot 2022-10-24T16:06:44+00:00
billing-data/TestExport/20220901-20220915/TestExport_6f92daf0-5c57-441d-a386-401ecd240d4c.csv BlockBlob Hot 820610 application/octet-stream 2022-10-24T16:06:47+00:00
billing-data/TestExport/20220901-20220915/TestExport_eb4fcbd4-7f59-4eb1-9ad5-38cd9dc84b3f.csv BlockBlob Hot 820610 application/octet-stream 2022-10-25T06:37:28+00:00
PythonプログラムでBLOBの確認
実行するプログラム
blob_download.py
import os
from azure.storage.blob import BlobServiceClient
# 接続文字列
CONNECTION_STRING = "[ストレージアカウント接続文字列]"
# コンテナ名
CONTAINER_NAME = "partnercenter"
# ローカルファイルパス(BLOBのターゲットと同一名)
LOCAL_PATH = "billing-data"
# Blobファイルをローカルにダウンロード
def blob_file_download():
# 接続文字列を用いてBlobServiceClientを作成
blob_service_client = BlobServiceClient.from_connection_string(CONNECTION_STRING)
# BLOB一覧の取得
blob_container = blob_service_client.get_container_client(CONTAINER_NAME)
blob_list = blob_container.list_blobs()
# BLOBデータのダウンロード
print(f'Download target blob : {os.path.join(LOCAL_PATH, "*")}')
for blob in blob_list :
# ローカル構成もBLOBディレクトリ構成と同一にする
if blob.name.startswith(LOCAL_PATH) :
# ディレクトリはスルー、ファイルのみダウンロード
if blob.size > 0 :
dirname, filename = os.path.split(blob.name)
print("Directory Name : ", dirname)
print("File Name : ", filename)
bytes = blob_container.get_blob_client(blob).download_blob().readall()
save_blob(blob.name, bytes)
else :
print(f'Ignore blob : {blob.name}')
# ダウンロードしたBlobファイルをローカルに保存します(既にファイルが存在した場合は上書処理)
def save_blob(file_name, file_content):
# ディレクトリ(がなければ)作成
os.makedirs(os.path.dirname(file_name), exist_ok=True)
# ファイル保存(BLOBフォルダと同一構成で保存)
with open(file_name, "wb") as file:
file.write(file_content)
if __name__ == "__main__":
blob_file_download()
プログラムの実行
## 実行
$ python blob_download.py
Download target blob : billing-data/*
Directory Name : billing-data/TestExport/20220901-20220915
File Name : TestExport_6f92daf0-5c57-441d-a386-401ecd240d4c.csv
Directory Name : billing-data/TestExport/20220901-20220915
File Name : TestExport_eb4fcbd4-7f59-4eb1-9ad5-38cd9dc84b3f.csv
## 確認
$ ls -l billing-data/TestExport/20220901-20220915
total 3216
drwxr-xr-x 4 ihoge staff 128 10 25 17:07 ./
drwxr-xr-x 3 ihoge staff 96 10 25 17:07 ../
-rw-r--r-- 1 ihoge staff 820610 10 25 17:21 TestExport_6f92daf0-5c57-441d-a386-401ecd240d4c.csv
-rw-r--r-- 1 ihoge staff 820610 10 25 17:21 TestExport_eb4fcbd4-7f59-4eb1-9ad5-38cd9dc84b3f.csv
まとめ
これで Pythonプログラム で Blob Storage からファイルをダウンロードできました。
参考記事
以下の記事を参考にさせていただきました。感謝申し上げます。
Azureストレージのコンテナーから、Pythonでファイルをダウンロードする
Azureストレージのコンテナーからディレクトリごと一括でダウンロードする