[Python] Googleドライブ上のファイルをダウンロードする
はじめに
Pythonスクリプトから、Googleドライブ上の指定フォルダ内にある、特定の拡張子を持つファイルをダウンロードする方法についてお伝えします。
手順は、下記となります。
Google Cloud Platformにて、プロジェクトを作成、秘密鍵を生成する
参照するGoogle Driveのフォルダを共有設定する
ライブラリをインストールする
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ドライブのフォルダの共有権限の設定を行います。
共有するフォルダを右クリックし、メニューを表示します。
次に、メニューから「共有」を選択します。
1.でダウンロードしたJSONファイルに記載されている「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のサンプルコード
この記事が気に入ったらサポートをしてみませんか?