中野智文のブログ

データ・マエショリストのメモ

GoogleCloudStorage からそのユーザーのGoogle Drive へコピーするツール

背景

社内の人が、GoogleCloudStorage から複数のファイルをダウンロードする必要があるが、CLIを使わないといけないらしく、だるい。 せめて自分のGoogleDriveにアップロードできればいいのに…

解決策

google colaboratory を使う。そのコードもAIで生成した。

# prompt: GCSの指定されたパスのデータを自分のGoogle Driveの指定されたフォルダ名を作成し、そのフォルダにコピーするツール

from google.colab import auth
from google.colab import drive
import os
from google.cloud import storage

auth.authenticate_user()

def copy_data_from_gcs_to_drive(gcs_path, drive_folder_name):
  """GCSの指定されたパスのデータを自分のGoogle Driveの指定されたフォルダ名を作成し、そのフォルダにコピーする。

  Args:
    gcs_path: コピー元のGCSパス (例: 'gs://my-bucket/my-folder')
    drive_folder_name: Google Driveに作成するフォルダ名
  """

  # Google Driveをマウント
  drive.mount('/content/drive')

  # Google Driveにフォルダを作成
  drive_folder_path = os.path.join('/content/drive/My Drive', drive_folder_name)
  if not os.path.exists(drive_folder_path):
    os.makedirs(drive_folder_path)

  # GCSクライアントを初期化
  storage_client = storage.Client()

  # GCSパスからバケット名とプレフィックスを取得
  bucket_name = gcs_path.split('//')[1].split('/')[0]
  prefix = '/'.join(gcs_path.split('//')[1].split('/')[1:])

  # バケットを取得
  bucket = storage_client.bucket(bucket_name)

  # プレフィックスに一致するBLOBをリストアップ
  blobs = bucket.list_blobs(prefix=prefix)

  # 各BLOBをGoogle Driveにコピー
  for blob in blobs:
    file_name = blob.name.split('/')[-1]
    drive_file_path = os.path.join(drive_folder_path, file_name)
    blob.download_to_filename(drive_file_path)
    print(f'Copied {blob.name} to {drive_file_path}')

# 使用例
gcs_path = 'gs://my-bucket/my-folder'  # コピー元のGCSパスを指定
drive_folder_name = 'my_gcs_data'  # Google Driveに作成するフォルダ名を指定
copy_data_from_gcs_to_drive(gcs_path, drive_folder_name)

まとめ

Google Colaboratory と AI を使って、秒で解決。