見出し画像

[Python] Googleドライブ上のファイルをダウンロードする

はじめに

Pythonスクリプトから、Googleドライブ上の指定フォルダ内にある、特定の拡張子を持つファイルをダウンロードする方法についてお伝えします。

手順は、下記となります。

  1. Google Cloud Platformにて、プロジェクトを作成、秘密鍵を生成する

  2. 参照するGoogle Driveのフォルダを共有設定する

  3. ライブラリをインストールする

  4. Pythonスクリプトを実装する

また、PythonスクリプトからGoogleドライブをアクセスする際、Google Drive APIを使用します。

Google Drive APIとは

Google Drive APIとは、Googleから提供されている、Googleドライブストレージのやり取りをするためのAPIです。

動作環境

・windows10
・Jupyter Notebook 6.4.3
・Python 3.8.11

手順

1.Google Cloud Platformにて、プロジェクトを作成、秘密鍵を生成する

詳細手順は、下記の記事の、1.Google Cloud Platformの設定をご参照ください。

変更になる箇所は、上記の記事の手順の中で、
1-2.作成したプロジェクトに対して、使用するAPIを有効化する
の項目で、有効化するAPIが「Google Drive API」1つとなる箇所です。

2.参照するGoogle Driveのフォルダを共有設定する

Pythonスクリプトからアクセスする、Googleドライブのフォルダの共有権限の設定を行います。

共有するフォルダを右クリックし、メニューを表示します。

次に、メニューから「共有」を選択します。

Googleドライブから共有を選択する画像
Googleドライブから共有を選択

1.でダウンロードしたJSONファイルに記載されている「client_email:」の後のメールアドレスをコピーし、赤枠部分にペーストします。

client_emailの後のメールアドレスを共有に設定する画像
client_emailの後のメールアドレスを共有に設定

「ユーザーやグループと共有」画面で、「送信」をクリックします。

共有画面で送信をクリックする画像
共有画面で送信をクリック

3.ライブラリをインストールする

使用するライブラリは、下記の3つです。

  • google-api-python-client

  • google-auth-httplib2

  • google-auth-oauthlib

上記3つのライブラリをインストールしていない場合、下記のようにインストールします。

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

4.Pythonスクリプトを実装する

全体の処理は、下記です。

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http

SCOPES = ['https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name(
    'service_account.json', SCOPES
)
http_auth = credentials.authorize(Http())

condition_list = [
    f"('{FOLDER_ID}' in parents)",
    "(name contains '.csv')"
]
conditions = " and ".join(condition_list)

results = drive_service.files().list(
    q = conditions,
    fields = "nextPageToken, files(id, name)",
    pageSize = 100, 
).execute()
files = results.get('files', [])

if files:
    for file in files:
        request = drive_service.files().get_media(fileId=file['id'])
        fh = io.FileIO(file['name'], mode='wb')
        downloader = MediaIoBaseDownload(fh, request)
        done = False
        while not done:
            _, done = downloader.next_chunk()

順番に処理の内容を説明します。

①OAuthの認証

OAuth認証の処理は、下記のようになります。

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http

SCOPES = ['https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name(
    'service_account.json', SCOPES
)
http_auth = credentials.authorize(Http())

ServiceAccountCredentials.from_json_keyfile_nameメソッドの第1引数には、手順1.「Google Cloud Platformにて、プロジェクトを作成、秘密鍵を生成する」でダウンロードしたJSONファイルのファイルパスを指定します。

②Googleドライブ上のファイル取得

Googleドライブのファイル情報を取得する処理は、下記のようになります。

condition_list = [
    f"('{FOLDER_ID}' in parents)",
    "(name contains '.csv')"
]
conditions = " and ".join(condition_list)

results = drive_service.files().list(
    q = conditions,
    fields = "nextPageToken, files(id, name)",
    pageSize = 100, 
).execute()
files = results.get('files', [])

drive_service.files().listメソッドで、Googleドライブのファイル情報を取得します。

drive_service.files().listメソッドのキーワード引数qを指定することで、検索条件を文字列で指定することができます。検索指定方法のサンプルは、下記をご参照ください。

キーワード引数qに渡す文字列を生成するために、配列を使用しています。今回のように複数の条件を指定する場合、おすすめの方法として下記のサイトに記載がありました。こちらの記事を参考に、キーワード引数qの指定を行っています。

③ファイルをダウンロードする

ファイル情報より取得したすべてのファイルを順番にダウンロードする処理は、下記のようになります。

if files:
    for file in files:
        request = drive_service.files().get_media(fileId=file['id'])
        fh = io.FileIO(file['name'], mode='wb')
        downloader = MediaIoBaseDownload(fh, request)
        done = False
        while not done:
            _, done = downloader.next_chunk()

ダウンロードしてきたファイルが配置されるフォルダは、実行中のPythonスクリプトのフォルダとなります。

まとめ

今回は、Pythonスクリプトから、Googleドライブ上の指定フォルダ内にある、特定の拡張子を持つファイルをダウンロードする方法についてお伝えしました。

ダウンロードを行いたいファイルの拡張子や、フォルダIDの指定を変更することで、応用可能です。

参考サイト

Google API Driveのサンプルコード


この記事が気に入ったらサポートをしてみませんか?