LoginSignup
6
7

More than 1 year has passed since last update.

PythonからGoogleDriveにファイルをアップロード

Last updated at Posted at 2022-11-03

PythonからGoogleDriveにファイルをアップロードするときの手順です。

事前準備

認証情報の作成

GoogleDriveのAPIを利用するために、GCP上から認証情報を作成しダウンロードする必要がある。

認証情報の作成のため、下記のURLからGCPにアクセスする。

認証情報は、ポータルの「GCP > 認証情報」から作成する。

スクリーンショット 2022-11-03 18.40.12.png

認証情報画面上部の「認証情報を作成」を押下し、「OauthクライアントID」を選択する。

スクリーンショット 2022-11-03 17.17.41.png

次の画面で、「アプリケーションの種類」に「ディスクトップアプリ」を選択する。「名前」は任意の名称を入力し、「作成」ボタンを押下する。

スクリーンショット 2022-11-03 17.19.24.png

作成が完了すると下記のような画面が表示されるので、「JSONをダウンロード」よりJsonファイルをダウンロードする。

スクリーンショット 2022-11-03 17.21.55.png

これで認証情報の準備が完了。ダウンロードした認証情報は、client_secrets.jsonの名称で保存しておく。

実装

必要ライブラリのインストール

GoogleDriveに接続するためのライブラリとして、PyDrive2を利用する。PyDrive2の名称の通りPyDriveも存在するが、そちらはもう更新されていない様子。これから新規で利用するのであれば、基本的にPyDrive2を使うのが良いだろう。

PyDrive2のインストールのために下記のコマンドを実行する。

pip install PyDrive2

settings.yamlの準備

認証情報に関する情報をsettings.yamlに記載する。

client_config_file: client_secrets.json

save_credentials: True
save_credentials_backend: file
save_credentials_file: saved_credentials.json

get_refresh_token: True

アップロードスクリプトの作成

import os

from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive


class GoogleDriveFacade:
    
    def __init__(self, setting_path: str='settings.yaml'):
        gauth = GoogleAuth(setting_path)
        gauth.LocalWebserverAuth()

        self.drive = GoogleDrive(gauth)

    def create_folder(self, folder_name):
        ret = self.check_files(folder_name)
        if ret:
            folder = ret
            print(f"{folder['title']}: exists")
        else:   
            folder = self.drive.CreateFile(
                {
                    'title': folder_name,
                    'mimeType': 'application/vnd.google-apps.folder'
                }
            )
            folder.Upload()

        return folder

    def check_files(self, folder_name,):
        query = f'title = "{os.path.basename(folder_name)}"'

        list = self.drive.ListFile({'q': query}).GetList()
        if len(list)> 0:
            return list[0]
        return False

    def upload(self, 
               local_file_path: str,
               save_folder_name: str = 'sample',
               is_convert : bool=True,
        ):
        
        if save_folder_name:
            folder = self.create_folder(save_folder_name)
        
        file = self.drive.CreateFile(
            {
                'title':os.path.basename(local_file_path),
                'parents': [
                    {'id': folder["id"]}
                ]
            }
        )
        file.SetContentFile(local_file_path)
        file.Upload({'convert': is_convert})
        
        drive_url = f"https://drive.google.com/uc?id={str( file['id'] )}" 
        return drive_url
    
        
if __name__ == "__main__":
    g = GoogleDriveFacade()
    g.upload(
        local_file_path='hoge.txt',
        save_folder_name="test",
        is_convert=True,
    )

動作確認

アップロード用にhoge.txtを作成し、マイドライブのtestフォルダにアップロードしてみる。

echo "Hello World" > hoge.txt
python main.py

初回実行時は下記のようなOAuth認証画面が表示されるので、画面に従って進めていく。はじめに利用するアカウントを選択する。

スクリーンショット 2022-11-03 17.43.17.png

その後確認画面が表示されるので、内容を確認し「続行」を押下する。

スクリーンショット 2022-11-03 17.43.52.png

認証が完了し、アップロード処理が完了する。

GoogleDriveにアクセスして確認すると、「test」フォルダが作成されていることが確認できる。

スクリーンショット 2022-11-03 18.05.57.png

その中に「hoge」というファイルがアップロードされていることが確認でき、内容も先ほど入力した内容が記載されている。

スクリーンショット 2022-11-03 18.07.04.png

初回実行時に、OAuth2の認証情報がsaved_credential.jsonの名称でローカルに保存される。そのため、2回目以降はOAuth2の認証画面を表示することなくGoogleDriveにファイルをアップロードできる。

6
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
6
7