🤖

【Google Cloud Storage】ローカルフォルダをGCSにアップロードする方法

2023/02/19に公開

概要

GCSに対して、ローカルフォルダをアップロードするコマンドを整理した。もちろんだが、フォルダ直下のサブディレクトリおよびそれ以下のファイルもアップロードされる。

必要なライブラリをインポート

まずは、必要なライブラリを一通りインポートする。

import datetime
import csv
from dateutil.relativedelta import relativedelta
from google.oauth2 import service_account
import os
import json
from google.cloud import storage

アカウント情報を取得

次に、個人のGCSにアクセスするために必要なtest-gcs.jsonを取得する。このファイルは、本プログラムと同じ階層に保存されている。ファイルには、type / project_id / private_key_id / private_key / client_emailなどが保存されている。

key_path = os.path.join(os.path.dirname(
    os.path.abspath(__file__)), 'test-gcs.json')
service_account_info = json.load(open(key_path))
credentials = service_account.Credentials.from_service_account_info(
    service_account_info)
storage_client = storage.Client(
    credentials=credentials,
    project=credentials.project_id,
)

バケット名、フォルダ名を指定

次に、GCSのバケット名を指定する。

project_id = credentials.project_id
client = storage.Client(project_id, credentials=credentials)
bucket_name = 'bucket_name_in_GCS'
bucket = client.get_bucket(bucket_name)

アップロードするローカルフォルダを指定

ローカルフォルダのパスを設定する。設定したフォルダ以下のサブディレクトリおよびファイルが全てアップロードされる。後ほど、アップロードしている「ローカルフォルダ+画像名」とアップロード先「フォルダパス+画像名」をターミナル上で出力するため、dirpath, dirnames, filenamesを設定している。

file_paths = []
local_folder_path = "/Users/username/Documents/xxx/yyy/zzz"
for dirpath, dirnames, filenames in os.walk(local_folder_path):
    for filename in filenames:
        file_paths.append(os.path.join(dirpath, filename))

アップロード先のGCSフォルダパスを設定して、ローカルフォルダ内のファイルをアップロードする

destination_folder_nameは、アップロード先のgcsフォルダパスを設定している。設定した上で、file_pathsに格納したfile_pathを取得して、ファイルをgcsにアップロードしている。最後に確認のため、ファイルアップロード先とファイル取得元のローカルパスをターミナルで出力している。

destination_folder_name = "foldername_in_GCS/"
for file_path in file_paths:
    destination_blob_name = os.path.join(destination_folder_name, os.path.relpath(file_path, local_folder_path))
    blob = bucket.blob(destination_blob_name)
    blob.upload_from_filename(file_path)
    
    print(
        "File {} uploaded to {}.".format(
            file_path, destination_blob_name
        )
    )

全体コード

import datetime
from dateutil.relativedelta import relativedelta
from google.oauth2 import service_account
import os
import json
from google.cloud import storage

key_path = os.path.join(os.path.dirname(
    os.path.abspath(__file__)), 'test-gcs.json')
service_account_info = json.load(open(key_path))
credentials = service_account.Credentials.from_service_account_info(
    service_account_info)
storage_client = storage.Client(
    credentials=credentials,
    project=credentials.project_id,
)

project_id = credentials.project_id
client = storage.Client(project_id, credentials=credentials)
bucket_name = 'bucket_name_in_GCS'
bucket = client.get_bucket(bucket_name)

file_paths = []
local_folder_path = "/Users/username/Documents/xxx/yyy/zzz"
for dirpath, dirnames, filenames in os.walk(local_folder_path):
    for filename in filenames:
        file_paths.append(os.path.join(dirpath, filename))

# フォルダ内のすべてのファイルをバケットにアップロードします。
# 下記は、バケット以下のGCSフォルダ名を入力すること
# バケットフォルダ名のフルパスがbucket_name/folderの場合、folderの部分のみ記載
destination_folder_name = "foldername_in_GCS/"
for file_path in file_paths:
    destination_blob_name = os.path.join(destination_folder_name, os.path.relpath(file_path, local_folder_path))
    blob = bucket.blob(destination_blob_name)
    blob.upload_from_filename(file_path)
    
    print(
        "File {} uploaded to {}.".format(
            file_path, destination_blob_name
        )
    )

Discussion