StorageをPythonから操作する、前記事の続きです。工夫したものは別の記事に分けていますので最終形態はそちらで。Pro、実装はPython3前提です。基本操作は前の記事で実装しましたが、フラットな構造に対応するために「ディレクトリ直下のファイルのみ同期」、というのはちょっと雑でした。今回は、元のローカルパスを合わせてBLOBのメタデータとして記録することで、何とかツリー構造に対応させたいと思います。今回はBLOB名をランダム文字列で作成し、メタデータを使ってローカルのパスを記録させ、サブディレクトリ含めツリー構造を保持することにします。サブディレクトリを含むとなると、多数のファイルが存在するような場合が厄介なことになりますが、まあ今回は目をつぶります。ファイル数が気になる場合は書庫に固めてしまうなどの代替案が考えられますが、今回は触れません。ついでにメタデータに他のファイル情報も書いておくことにします。うまくやれば、一定以下のサイズのファイルのみ転送したり、最近に更新があったもののみ転送する、などの使い方ができます。今回のスクリプトです。前記事の_blob_clientクラスを変更しています。変更していますが基本は同じ。変更点を以下に記載していきます。{}".format(blob))self.client.delete_blob(container_name=self.__container,blob_name=blob)メタデータの設定メタデータはBLOBの作成時(ローカルファイルのアップロード時)に設定できる他、既存のBLOBに対して個別に設定できます。今回のスクリプトでは_blob_client.upload()メソッドを改変し、内部のcreate_blob_from_path()メソッドにメタデータとして辞書を渡して設定します。内容(key-valueのペア)は文字列である必要があります。metadata=meta_)1234self.client.create_blob_from_path(container_name=self.__container,blob_name=name_,file_path=local_path,metadata=meta_)今回はローカルにあるファイルのパス(対象ディレクトリからの相対パス)、最終更新日時、サイズ(バイト数)をメタデータとして設定します。ローカルのファイルとBLOBの属性を比較できるように、ローカルファイルの検索時(_blob_client.fetch_localメソッド)にも同等の情報を取得できるようにしました。一方で、BLOB名にはランダムな文字列で生成したIDをセットしています。生成方法は何でもいいのですが、ファイル名のみでは重複する可能性があるのでこうしました。k=16))メタデータの取得get_blob_metadata()メソッドを呼んで、特定のBLOBのメタデータ(辞書型)を取得します。ここではダウンロードの際に(ダウンロード先の)ローカルファイルを作成すべきパスを生成するために使います。self.client.get_blob_metadata(container_name=self.__container,blob_name=blob.name)ちなみに、ダウンロード時には途中のディレクトリが存在しない場合が考えられるので、明示的に作成しています。exist_ok=True)日本語対応マルチバイト文字といった方が正確かもしれませんが、メタデータに使える文字列には制約があり、日本語が使えません。今回はローカルのファイルのパスをメタデータに設定しているので、日本語を含む名前のファイルやディレクトリがあると困ったことになります。仕方ないのでURLエンコードを使います。ちなみにBLOB名には日本語が使えます。内部的にエンコード(パーセントエスケープ)しているのでしょう。ここではアップロード時にエンコードし、ダウンロード時にデコードしています。いずれもurllib.parseモジュールを使用しています。Storageを経由すると、ファイルのメタ情報(タイムスタンプやパーミッション)が保持されません。今回は最終更新日時のみ保持する仕組みを作っておくことにしました。具体的には、メタデータに最終更新日時を書いてアップロードし、またダウンロード後にファイルのタイムスタンプを設定しなおす、という操作を行います。BLOB自身にもタイムスタンプを表すプロパティがあるのですが、今回はメタデータにまとめるということで。"{}".format(os.path.getsize(path_))}os.utimeメソッドに同じ最終アクセス日時と最終更新日時をセットして、ファイルのタイムスタンプを書き換えます。mtime_))また、各メソッドにファイルパスやBLOB名を個別に指定できるよう引数を変更しています。使い方は次回まとめて記載します。2.0で使えるシンプルなConvertTo-Jsonの作成PowerShellを使っていて、他の言語やAPIと連携させようとすると、データ形式が大事になってきます。SDKを使って、Python3で簡単なファイル共有ツールを実装してみたいと思います。BL...記事を読むPowerShellとPythonで性能情報を取得するたまに性能情報を取得したいことがありますが、スクリプトでできると便利ですよね。~レボリューションズ~別記事の続きです。Storageは従量課金なので、できるだけ通信量や消費容量を削減したいですね。Azure側でのレプリケーシ...記事を読むLinuxからWindows共有フォルダをマウントするLinuxからWindows共有フォルダ、というかSMBサーバにアクセスできると便利ですよね。最近はUbuntuなどのよく使われているデ...記事を読むInfluxDBとGrafanaで作るサーバ監視環境Grafanaはデータの視覚化ツールとして人気ですね。今回はInfluxDBをデータソースとして性能監視環境を構築した際のメモです。...記事を読むPythonとElasticsearchの夕べElasticsearchの魅力の一つは豊富な機能。その分、使いこなすのが大変なので、少しでも実例ベースで勉強したいところです。(関連設定の取得・設定変更)別記事の続きです。ここではポートフォワードの設定や仮想メディアの情報取得について書いておきます。完成形のサンプルは最後に掲載します。...記事を読むPython3でJPEG画像のExifを取得し、回転方向を修正するちょっと古いPCや安物のデバイスでJPEGを表示させようとすると、上下が反転していたりします。ServiceはAzureのPaaS環境。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。