GoogleCloudStorageでPythonからファイルをやりとりする方法

Python Cloud Storage アップロード・ダウンロード

こんばんは、エンジニアの眠れない夜です。

ここではGoogleCloudPlatformのCloudStorageにPythonからファイルをアップロード・ダウンローする方法をご紹介します。

google cloud platform

 

分かってしまえばなんて事のない事なのですが、なかなかファイルのアップロードとダウンロードができなくて何時間も費やしてしまいました。

このブログを読んでくださる方は5分もあればCloudStorage(クラウドストレージ)にファイルの保存、取得ができるようになります。

CloudStorage(クラウドストレージ)の概要

  1. クラウドストレージにアクセスするにはサービス アカウントというクラウドストレージにアクセスするためのアカウントとバケット(ストレージ)を作成します。
  2. 作成したアカウントの認証キーを使って認証を行います。
  3. あとはストレージにPythonプログラムからアクセス実行するだけ。

という3ステップになっています。

サービスアカウントの作成(API)

APIの画面に移動してクラウドストレージ関係のAPIが有効になっているか確認してください。有効になっている場合は右側に「無効にする」という表示が出ています。

サービス_アカウントの作成とアクセス権付与

続いて認証情報のページからサービスアカウントを作成します。

サービスアカウント作成認証情報_-_API_project

新しいサービスアカウントを選択肢します。

アカウント名を適当につけて、役割をストレージ管理者にます。

キーのタイプはJSONを選択して「作成」します。

サービス_アカウント_キーの作成_-_API_project

JSONファイルがダウンロードされるので大切に保管してください。次のステップで利用します。

クラウドストレージでバケットを作成

ストレージの項目からブラウザを選択すると「バケットを作成」できます。

バケットの名前はまだ誰も使ったことがない名前でないといけないようなのでユニークな名前になるように名前をつけます。

あとは作成を押すだけです。

バケットの作成Python

ここでつけた名前はあとで利用するのでメモしておきましょう。

 

CloudStorageの認証キーを設定

続いて先ほどダウンロードした認証キーを設定します。キーファイルはパソコンにパスを通してもいいですし、Pythonのプログラム上でパスを通してもOKです。

パスを通す時の変数名は「GOOGLE_APPLICATION_CREDENTIALS」にしてください。認証を行う際にこの変数名にキーファイルが設定されているとそのキーファイルのユーザーを利用してGoogleクラウドに接続します。

設定されていない場合はデフォルトのユーザーが利用されます。

Pythonのプログラム上でパスを通す場合はこのように実行してください

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='キーファイルのパス'

これだけなので簡単ですね。

ファイルのパスがわからない場合はMacの場合、ターミナルにファイルをドラッグするとファイルのパスを表示してくれます。私はいつもこれをコピペで使っています。タイプミスすることがないので余計な手間が省けます。

※ 絶対パスになってしまうので注意
※ ターミナル上ではスペースの前にバックスラッシュが入りますが、Pythonではバックスラッシュは消してください。

ここまでくればもうクラウドストレージにアクセスできる状態です。

続いてクラウドストレージを操作してみましょう。

PythonからCloudStorageを操作

まずはGoogleクラウドのパッケージをインストールします。

sudo pip install --upgrade google-cloud

インストールができたらストレージに接続します。

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='キーファイルのパス'from google.cloud import storage
client = storage.Client()
# https://console.cloud.google.com/storage/browser/[bucket-id]/
bucket = client.get_bucket('バケット名')

※ 先ほどのキーファイルへのパスの設定も合わせて上記のようになります。
※ バケット名は先ほど設定したバケットの名前を使用します。

この状態でバケットに接続ができています。

CloudStorageにファイルをアップロードする方法

バケットにファイルをアップロードするにはblobという関数を使用します。

blob = bucket.blob('保存ファイル名')
blob.upload_from_filename(filename='アップロードファイルパス')

この2行を実行するだけでファイルのアップロードができます。

アップロードができているかは下記の2行で確認できます。list_blobs()でバケットに保存されているファイル一覧を取得できます。

for f in bucket.list_blobs():
print(f)

これで先ほど指定した「保存ファイル名」が表示されればOKです。

バケットにフォルダを作る方法

バケットにフォルダを作ってその中にファイルを保存したい!という人のは保存ファイル名を /doc/document.txt みたいに入力してください。

すると doc フォルダの中に document.txt というファイルが作成されます。アップロードする時に勝手にフォルダを作ってくれるのでフォルダを作るコマンド(mkdir)みたいなのは存在しませんです。

フォルダ名を間違えても勝手にフォルダを作ってエラーが返ってこないので注意が必要です。

CloudStorageからファイルをダウンロードする方法

ダウンロードと書きましたが正確には取得の方法です。

blob = bucket.get_blob('ダウンロードファイル名(ファイルパス)')
print(blob.download_as_string())

これで、指定したファイルの中身をstringで取得できました。

最後に

いかがでしたか?APIキーを作成して、パスを通すだけなので簡単ですよね。

たったこれだけのことでも色々調べながらやるとなかなか到達できなかったので誰かのお役に立てれば幸いです。

Googleの公式ドキュメントって本当に不親切というかなんというか…
誰かが上げている記事のほうが分かりやすいことが多い気がするのは私だけでしょうか…?

コピペで実行したい人のために上で説明した内容をまとめました。ローカルのファイルをアップロードして、そのファイルを取得するという流れになっています。

import os
from google.cloud import storage
#クラウドストレージ(バケット)に接続
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='キーファイルパス(Json)'
client = storage.Client()
bucket = client.get_bucket('バケット名')

#ファイルをアップロード
blob = bucket.blob('保存ファイル名')
blob.upload_from_filename(filename='ローカルファイルパス')

#アップロードしたファイルをダウンロード
blob2 = bucket.get_blob('取得ファイル名')
print(blob2.download_as_string())

※ 動作確認では保存ファイル名と取得ファイル名は同じ名前を入力してください。

アップロードして、テキストとして取得しただけなのでまだまだ他のファイル形式だったらどうやって保存するんだろ?とか疑問は残りますがその辺りは追い追いどこかで書ければと思います。

この説明だとわからないとか間違ってるところがあるとか色々コメントをいただけると今後の記事更新の励みになります!最後まで読んでいただきありがとうございます。

Twitterもやっているので、フォローいただけると嬉しいです(^^)

Googleストレージ公式ドキュメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください