Storage Blob operation using Python API#
Blobのアップロード (ローカルのファイル・システムからAzure Storageへ)#
GUI: Azure Storage Explorer
CUI: AzCopy (後述)
Blobのダウンロードとロード (Azure StorageからJupyterHubのシングルユーザ・サーバへ)#
CUI: AzCopy (後述)
Python API
ロード (on-the-fly) に用いる関数が
IO[T]
型でread()
メソッドに対応している場合:BlobClient.download_blob()
をそのまま使うe.g.
pands.read_csv(fp: IO[T])
,json.load(fp: IO[T])
IO[T]
型でない場合:BlobClient.download_blob().readall()
やBlobClient.download_blob().chunks()
を使うe.g.
IPython.display.Audio(s: bytes)
,json.loads(s: Union[str, bytes])
ファイルに保存してから参照する
BlobClient.download_blob().readinto(fp: IO[T])
を使う
参考)
Quickstart: Azure Blob Storage client library for Python - Azure Storage | Microsoft Learn
Python を使用して BLOB をダウンロードする - Azure Storage | Microsoft Learn
BlobServiceClientを作成する (キャッシュされたトークンで認証)#
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient, BlobClient
account_url = "https://ecsosaka416528d.blob.core.windows.net"
default_credential = DefaultAzureCredential()
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential=default_credential)
BlobClientを作成する#
JSON形式のファイルをロードする#
container_name="textbook-2023"
file_name="chapters/01/01_intro.ipynb"
blob_client = blob_service_client.get_blob_client(container=container_name, blob=file_name)
import json
# json.load(fp: IO[T]) によるロード
json.load(blob_client.download_blob())
{'cells': [{'attachments': {},
'cell_type': 'markdown',
'metadata': {},
'source': ['# 学問への扉: プログラミングで遡る科学史\n',
'\n',
'## 初回授業の説明\n',
'\n',
'* JupyterHub (https://ecsosaka-jh2310.japaneast.cloudapp.azure.com/) への接続\n',
' - GitHub Pages (https://cloudedu-osaka.github.io/textbook-2023/) へアクセス (⬅いまここです)\n',
' - JupyterHubへの移動\n',
' - OUMailによる多要素認証\n',
' - 簡単なセルの実行\n',
'* ChatGPT (OpenAI API) キーの取得\n',
' - アカウントの作成\n',
' - ChatGPTをアクセするためのキーを取得する\n',
' - (本授業の組織への参加は次回)\n',
'* JupyterHub + ChatGPI\n',
' - 上で取得したキーを登録する\n',
' - チャットによるプログラミングを体験する']},
{'attachments': {}, 'cell_type': 'markdown', 'metadata': {}, 'source': []},
{'attachments': {},
'cell_type': 'markdown',
'metadata': {},
'source': ['## JupyterHubに接続しプログラムを実行する\n',
'\n',
'* 上のロケットのアイコンから"JupyterHub"をクリックすると、この授業用のJupyterHubへ遷移するので、OUMailアカウントで認証する (多要素認証)\n',
'* 下のセルを選択し、Shift+Enter (return) で実行する']},
{'cell_type': 'code',
'execution_count': None,
'metadata': {},
'outputs': [],
'source': ['1+1']},
{'cell_type': 'code',
'execution_count': None,
'metadata': {},
'outputs': [],
'source': []}],
'metadata': {'kernelspec': {'display_name': 'Python 3 (ipykernel)',
'language': 'python',
'name': 'python3'},
'language_info': {'codemirror_mode': {'name': 'ipython', 'version': 3},
'file_extension': '.py',
'mimetype': 'text/x-python',
'name': 'python',
'nbconvert_exporter': 'python',
'pygments_lexer': 'ipython3',
'version': '3.9.15'}},
'nbformat': 4,
'nbformat_minor': 4}
# json.loads(s: bytes) によるロード
blob_bytes = blob_client.download_blob().readall()
json.loads(blob_bytes)
{'cells': [{'attachments': {},
'cell_type': 'markdown',
'metadata': {},
'source': ['# 学問への扉: プログラミングで遡る科学史\n',
'\n',
'## 初回授業の説明\n',
'\n',
'* JupyterHub (https://ecsosaka-jh2310.japaneast.cloudapp.azure.com/) への接続\n',
' - GitHub Pages (https://cloudedu-osaka.github.io/textbook-2023/) へアクセス (⬅いまここです)\n',
' - JupyterHubへの移動\n',
' - OUMailによる多要素認証\n',
' - 簡単なセルの実行\n',
'* ChatGPT (OpenAI API) キーの取得\n',
' - アカウントの作成\n',
' - ChatGPTをアクセするためのキーを取得する\n',
' - (本授業の組織への参加は次回)\n',
'* JupyterHub + ChatGPI\n',
' - 上で取得したキーを登録する\n',
' - チャットによるプログラミングを体験する']},
{'attachments': {}, 'cell_type': 'markdown', 'metadata': {}, 'source': []},
{'attachments': {},
'cell_type': 'markdown',
'metadata': {},
'source': ['## JupyterHubに接続しプログラムを実行する\n',
'\n',
'* 上のロケットのアイコンから"JupyterHub"をクリックすると、この授業用のJupyterHubへ遷移するので、OUMailアカウントで認証する (多要素認証)\n',
'* 下のセルを選択し、Shift+Enter (return) で実行する']},
{'cell_type': 'code',
'execution_count': None,
'metadata': {},
'outputs': [],
'source': ['1+1']},
{'cell_type': 'code',
'execution_count': None,
'metadata': {},
'outputs': [],
'source': []}],
'metadata': {'kernelspec': {'display_name': 'Python 3 (ipykernel)',
'language': 'python',
'name': 'python3'},
'language_info': {'codemirror_mode': {'name': 'ipython', 'version': 3},
'file_extension': '.py',
'mimetype': 'text/x-python',
'name': 'python',
'nbconvert_exporter': 'python',
'pygments_lexer': 'ipython3',
'version': '3.9.15'}},
'nbformat': 4,
'nbformat_minor': 4}
CSV形式のファイルをダウンロードする#
from azure.storage.blob import BlobClient
import pandas as pd
container_name="mnist"
file_name="mnist_test.csv"
blob_client = blob_service_client.get_blob_client(container=container_name, blob=file_name)
# pandas.read_csv()はIO[T]型を扱うことができる
df = pd.read_csv(blob_client.download_blob(), header=None)
import matplotlib.pyplot as plt
plt.imshow(df.iloc[0].to_numpy()[1:].reshape(28, 28), cmap='gray_r')
<matplotlib.image.AxesImage at 0x7fec568ac250>
波形ファイルをダウンロードしてそのままメモリに格納する#
container_name="textbook-2023"
file_name="chapters/05/FMP_C1_F23_Piano.wav"
blob_client = blob_service_client.get_blob_client(container=container_name, blob=file_name)
# メモリに展開する
blob_bytes = blob_client.download_blob().readall()
from IPython.display import Audio
Audio(blob_bytes)
波形ファイルをダウンロードしてファイルに保存する#
import os
with open(file=os.path.join(r'.', r'FMP_C1_F23_Piano.wav'), mode="wb") as fp:
download_stream = blob_client.download_blob()
download_stream.readinto(fp)
Audio('./FMP_C1_F23_Piano.wav')
波形ファイルをダウンロードしながらファイルに保存する#
with open(file=os.path.join(r'.', r'FMP_C1_F23_Piano.wav'), mode="wb") as fp:
download_stream = blob_client.download_blob()
for chunk in download_stream.chunks():
# print(len(chunk)) < 4MiB
fp.write(chunk)
Audio('./FMP_C1_F23_Piano.wav')