Storage Blob operation using Python API#

Blobのアップロード (ローカルのファイル・システムからAzure Storageへ)#

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]) を使う

参考)

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>
_images/afbade4ec87533dcd6cda47880307f1f3631bc6d2675b20476290baef0c4a560.png

波形ファイルをダウンロードしてそのままメモリに格納する#

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