Python - невозможно загрузить файл с Google Drive с помощью Google Drive API - PullRequest
0 голосов
/ 04 декабря 2018

Я пытался использовать Google Drive API для автоматизации загрузки некоторых файлов с моего Google Drive, выбрав для этого Python 3.6.5.

Сначала я следовал образец быстрого запуска (который работал отлично), а затем перешел к образцу загрузки файлов , и именно тогда началась головная боль.Сначала я просто «объединил» оба примера в приведенном ниже коде:

from __future__ import print_function
from apiclient import discovery
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import io
# from oauth2client import client
# from oauth2client import tools

SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

def main():


    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('drive', 'v3', http=creds.authorize(Http()))

    file_id = 'myfileID'
    request = drive_service.files().get_media(fileId=file_id)
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print "Download %d%%." % int(status.progress() * 100)


if __name__ == '__main__':
    main()

Но это не сработало, поскольку Python не смог определить MediaIoBaseDownload .Затем я перешел к следующему коду:

from __future__ import print_function
from apiclient import discovery
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import io
# from oauth2client import client
# from oauth2client import tools

SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

def main():


    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('drive', 'v3', http=creds.authorize(Http()))

    file_id = 'myfileID'
    request = service.files().get_media(fileId=file_id)

    fh = io.BytesIO()
    with open('mydestinationFile', 'wb') as f:
        f.write(request)

    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%." % int(status.progress() * 100))


if __name__ == '__main__':
    main()

Теперь получаю ошибку:

Traceback (most recent call last):
  File "Google API.py", line 50, in <module>
    main()
  File "Google API.py", line 32, in main
    f.write(request)
TypeError: a bytes-like object is required, not 'HttpRequest'

Я гуглил ее и даже искал здесь на SO, но не смог найти ничего похожего,Я знаю, что делаю что-то серьезно неправильно, но не могу точно сказать, что именно.

1 Ответ

0 голосов
/ 25 августа 2019

MediaIoBaseDownload - это метод в классе googleapiclient.http, поэтому вы можете включить следующую строку в код для решения этой проблемы:

from googleapiclient.http import MediaIoBaseDownload

Я решил эту часть проблемы, но все еще могускачать файл.

...