LoginSignup
5
7

More than 5 years have passed since last update.

PythonでAzure Storageへファイルをアップロードしたりダウンロードしたり

Last updated at Posted at 2018-08-10

はじめに

Azure StorageへPythonを使ってアップロードやダウンロードする事があったので、その備忘録

そもそもAzure Storageとは

手順

パッケージのインストール

PythonでAzure Storageの操作が行えるよう下記コマンドでパッケージインストール

pip install azure-storage
pip install pytz

※pytzはSASの時間設定をがタイムゾーンでの指定の為必要

ソースコード

まず事前に、Azure Storagのアクセスに、Azure Storagのストレージアカウント名とストレージアカウントキーが必要になるので先に用意しておく必要。
またはSASトークンを使用してのアクセスを行うためそのソースも残しておく。
※SASについてこの記事がわかりやすかったの以下を参照(ストレージアカウント名とストレージアカウントキーがある場所についてもここに書いている。またPHPでのアップロードやダウンロード方法も載っている。)
Azure Storageへのアクセス方法 【Shared Access Signatures (SAS)】

SASトークン作成

ファイルのダウンロードにはストレージアカウント名とストレージアカウントキーそして、ダウンロードが格納されているコンテナ名が必要。
azureblob.ContainerPermissionsでどのアクセス許可を指定可能。

create_sas.py
def create_sas(account_name, account_key, container_name):
    blob_client = azureblob.BlockBlobService(account_name=account_name, account_key=account_key)
    expiry = datetime.now(timezone('UTC'))  + timedelta(minutes=6)
    permission = azureblob.ContainerPermissions(read=True, write=True)
    sas = blob_client.generate_container_shared_access_signature(container_name,permission=permission,expiry=expiry)
    return sas

ダウンロード部分

ファイルのダウンロードにはストレージアカウント名とストレージアカウントキーそして、ダウンロードが格納されているコンテナ名が必要。

download.py
def download(account_name, account_key, container_name, download_file, download_dir):
    sas_token = create_sas(account_name, account_key, container_name)
    blob_client = azureblob.BlockBlobService(account_name=account_name, account_key=account_key, sas_token=sas_token)
    dl_file = "{}/{}".format(download_dir, download_file)
    blob_client.get_blob_to_path(container_name, download_file, dl_file)

またコンテナのファイルすべてをダウンロードしたい場合は以下のようなコードとなる。
ただ、このソースだと、コンテナ内に仮想ディレクトリがある場合、事前にダウンロードディレクトリに同じ名前のディレクトリを用意しておかないと行けないので注意

download.py
def download(account_name, account_key, container_name, download_file, download_dir):
    sas_token = create_sas(account_name, account_key, container_name)
    blob_client = azureblob.BlockBlobService(account_name=account_name, account_key=account_key, sas_token=sas_token)
    generator = blob_client.list_blobs(container_name)
    for blob in generator:
        dl_file = "{}/{}".format(download_dir, os.path.dirname(blob.name))
        dl_dir = os.path.dirname(dl_file)
        blob_client.get_blob_to_path(container_name, blob.name, dl_file)

アップロード部分

アップロードする際にazureblob.models.ContentSettingsでアップロードするファイルのtype以外にもファイルのencodingなども設定することが可能。

upload.py
def upload(account_name, account_key, container_name, upload_file):
    sas_token = create_sas(container_name)
    blob_client = azureblob.BlockBlobService(account_name=account_name, account_key=account_key, sas_token=sas_token)
    content_settings = azureblob.models.ContentSettings(content_type='application/octet-stream')
    upload_name = os.path.basename(upload_file)
    blob_client.create_blob_from_path(container_name, upload_name, upload_file, content_settings)

参照

クイック スタート: Python を使用して BLOB をアップロード、ダウンロード、および一覧表示する

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7