AI関連のファイルで数GBのものがあった(BERT)。colabで学習させてGoogleDriveに結果保存していたものをGoogleDriveからローカルやサーバーにダウンロードしたい。pydrive
使おうとしたがコケた。
結論
pydrive
ではなくpydrive2
使う。でかいファイルがダウンロードできる
内容
ダウンロードファイルがでかすぎてpydrive
ではコケる。pydrive2では行ける
内部で使っているメソッドが変わっているらしい
githubにisssueたっててpydrive2使えって案内されていた。
GoogleDriveからのダウンロードは使い捨てプログラムなのでStackOverflowなどを見ながら地道にAPI叩いても良いのだとおもう。
でも私はさらにライブラリ使って楽をしたかった。
他、設定
任意の場所にダウンロードプログラムがあってpydrive2の設定ファイルも持ちたくないとき下記で設定色々行ける
# client_secretsの場所
GoogleAuth.DEFAULT_SETTINGS['client_config_file'] = os.path.dirname(os.path.abspath(__file__)) + '/resources/client_secrets.json'
# 認証情報をファイルに保存する設定
GoogleAuth.DEFAULT_SETTINGS['save_credentials'] = True
GoogleAuth.DEFAULT_SETTINGS['save_credentials_backend'] = 'file'
# credentialsファイルの保存先
GoogleAuth.DEFAULT_SETTINGS['save_credentials_file'] = os.path.dirname(os.path.abspath(__file__)) + '/resources/' + 'saved_credentials.json'
GoogleAuth.DEFAULT_SETTINGS['get_refresh_token'] = True
任意の場所のclient_secretsを使い、credentialsを任意の場所に保存する
pydrive2
でフォルダーまるごとGoogleDriveからダウンロードしてくる全コード
どこからかあつめてきたコードをまとめて載せます
import os
from pydrive2.drive import GoogleDrive
from pydrive2.auth import GoogleAuth
GoogleAuth.DEFAULT_SETTINGS['client_config_file'] = os.path.dirname(
os.path.abspath(__file__)) + '/resources/client_secrets.json'
# 認証情報をファイルに保存する設定
GoogleAuth.DEFAULT_SETTINGS['save_credentials'] = True
GoogleAuth.DEFAULT_SETTINGS['save_credentials_backend'] = 'file'
GoogleAuth.DEFAULT_SETTINGS['save_credentials_file'] = os.path.dirname(
os.path.abspath(__file__)) + '/resources/' + 'saved_credentials.json'
# 認証情報(credentials)を自動で更新する設定
GoogleAuth.DEFAULT_SETTINGS['get_refresh_token'] = True
os.chdir(os.path.dirname(os.path.abspath(__file__)))
gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)
def download_recursively(save_folder, drive_folder_id):
# 保存先フォルダがなければ作成
if not os.path.exists(save_folder):
os.makedirs(save_folder)
max_results = 100
query = "'{}' in parents and trashed=false".format(drive_folder_id)
for file_list in drive.ListFile({'q': query, 'maxResults': max_results}):
for file in file_list:
print(file)
# mimeTypeでフォルダか判別
if file['mimeType'] == 'application/vnd.google-apps.folder':
download_recursively(os.path.join(save_folder, file['title']), file['id'])
else:
file.GetContentFile(os.path.join(save_folder, file['title']))
if __name__ == '__main__':
# lang model
drive_folder_id = '1-4dxxxxxx'
save_folder = '../Folder/a'
download_recursively(save_folder, drive_folder_id)
# wiki
drive_folder_id = '19xxxxxxxxxx'
save_folder = '../Folder/b'
download_recursively(save_folder, drive_folder_id)
# label_id
drive_folder_id = '1aVSxxxxxxxx'
save_folder = '../Folder/c'
download_recursively(save_folder, drive_folder_id)
以上です。