Googleドライブからファイルをダウンロードしようとしていますが、ドライブのURLしかありません。
私は、いくつかの資格情報(主にjsonファイル/ oauth)も必要とする、いくつかのdrive_serviceとMedioIOについて話すgoogle apiについて読みました。しかし、私はそれがどのように機能するかについてのアイデアを得ることができません。
また、urllib2 urlretrieveを試しましたが、私の場合はドライブからファイルを取得します。 「wget」も試してみましたが、使いません。
Pydriveライブラリを試しました。運転には良いアップロード機能がありますが、ダウンロードオプションはありません。
任意の助けをいただければ幸いです。ありがとう。
「ドライブのURL」とは、Googleドライブ上のファイルの共有可能リンクを意味する場合、以下が役立つ可能性があります。
import requests
def download_file_from_google_drive(id, destination):
URL = "https://docs.google.com/uc?export=download"
session = requests.Session()
response = session.get(URL, params = { 'id' : id }, stream = True)
token = get_confirm_token(response)
if token:
params = { 'id' : id, 'confirm' : token }
response = session.get(URL, params = params, stream = True)
save_response_content(response, destination)
def get_confirm_token(response):
for key, value in response.cookies.items():
if key.startswith('download_warning'):
return value
return None
def save_response_content(response, destination):
CHUNK_SIZE = 32768
with open(destination, "wb") as f:
for chunk in response.iter_content(CHUNK_SIZE):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
if __name__ == "__main__":
file_id = 'TAKE ID FROM SHAREABLE LINK'
destination = 'DESTINATION FILE ON YOUR DISK'
download_file_from_google_drive(file_id, destination)
ただし、SnippedはpydriveもGoogle Drive SDKも使用しません。 requests モジュールを使用します(これはurllib2に代わるものです)。
Googleドライブから大きなファイルをダウンロードする場合、1回のGETリクエストでは不十分です。 2つ目は必要です- Googleドライブからのwget/curl大きなファイル を参照してください。
同様のニーズが何度もあったので、上記の@ user115202のスニペットから開始する特別な単純なクラスGoogleDriveDownloader
を作成しました。ソースコードを見つけることができます こちら 。
Pipからインストールすることもできます:
pip install googledrivedownloader
次に、使用方法は次のように簡単です。
from google_drive_downloader import GoogleDriveDownloader as gdd
gdd.download_file_from_google_drive(file_id='1iytA1n2z4go3uVCwE__vIKouTKyIDjEq',
dest_path='./data/mnist.Zip',
unzip=True)
このスニペットは、Googleドライブで共有されているアーカイブをダウンロードします。この場合 1iytA1n2z4go3uVCwE__vIKouTKyIDjEq
は、Googleドライブから取得した共有可能なリンクのIDです。
PyDrive
を使用すると、関数GetContentFile()
を含むファイルをダウンロードできます。関数のドキュメントを見つけることができます here 。
以下の例を参照してください。
# Initialize GoogleDriveFile instance with file id.
file_obj = drive.CreateFile({'id': '<your file ID here>'})
file_obj.GetContentFile('cats.png') # Download file as 'cats.png'.
このコードは、認証済みdrive
オブジェクトがあることを前提としています。これに関するドキュメントは here および here にあります。
一般的な場合、これは次のように行われます。
from pydrive.auth import GoogleAuth
gauth = GoogleAuth()
# Create local webserver which automatically handles authentication.
gauth.LocalWebserverAuth()
# Create GoogleDrive instance with authenticated GoogleAuth instance.
drive = GoogleDrive(gauth)
サーバーでのサイレント認証に関する情報は here にあり、settings.yaml
(例: here )ここで、認証の詳細を保存します。
# Importing [PyDrive][1] OAuth
from pydrive.auth import GoogleAuth
def download_tracking_file_by_id(file_id, download_dir):
gauth = GoogleAuth(settings_file='../settings.yaml')
# Try to load saved client credentials
gauth.LoadCredentialsFile("../credentials.json")
if gauth.credentials is None:
# Authenticate if they're not there
gauth.LocalWebserverAuth()
Elif gauth.access_token_expired:
# Refresh them if expired
gauth.Refresh()
else:
# Initialize the saved creds
gauth.Authorize()
# Save the current credentials to a file
gauth.SaveCredentialsFile("../credentials.json")
drive = GoogleDrive(gauth)
logger.debug("Trying to download file_id " + str(file_id))
file6 = drive.CreateFile({'id': file_id})
file6.GetContentFile(download_dir+'mapmob.Zip')
zipfile.ZipFile(download_dir + 'test.Zip').extractall(UNZIP_DIR)
tracking_data_location = download_dir + 'test.json'
return tracking_data_location
上記の関数は、file_idが指定されたファイルを指定されたダウンロードフォルダーにダウンロードします。さて、問題は残っています。file_idを取得する方法は? URLをid =で分割して、file_idを取得します。
file_id = url.split("id=")[1]
これについても上記で説明しましたが、
from pydrive.auth import GoogleAuth
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
これにより、独自のサーバーが作成され、認証の汚い作業が行われます
file_obj = drive.CreateFile({'id': '<Put the file ID here>'})
file_obj.GetContentFile('Demo.txt')
これはファイルをダウンロードします