загрузка файла с Google Drive с помощью API (NameError: имя 'service' не определено) - PullRequest
0 голосов
/ 06 сентября 2018
from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

# If modifying these scopes, delete the file token.json.
SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

def main():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    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()))

    # Call the Drive v3 API
    results = service.files().list(
        pageSize=10, fields="nextPageToken, files(id, name)").execute()
    items = results.get('files', [])

    if not items:
        print('No files found.')
    else:
        print('Files:')
        for item in items:
            print('{0} ({1})'.format(item['name'], item['id']))

if __name__ == '__main__':
    main()

сохранить как quickstart.py и запустить этот файл. Процесс аутентификации завершен. затем token.json был сгенерирован в каталоге. скачать файл doc

file_id = '1wzCjl51u131v1KBgpbiKLJs8DPPakhXCFosfYjp7BY0'
request = 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))

идентификатор был скопирован из https://docs.google.com/document/d/1wzCjl51u131v1KBgpbiKLJs8DPPakhXCFosfYjp7BY0/edit?usp=sharing

и request = drive_service.files (). Get_media (fileId = file_id)

изменить на

request = service.files (). Get_media (fileId = file_id)

в примере, сохраненном как p.py при исполнении

line 2, in <module>
    request = service.files().get_media(fileId=file_id)
NameError: name 'service' is not defined

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вот как я это делаю

from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file
​
SCOPES = ['https://www.googleapis.com/auth/drive.readonly']
​
​
def login_gdrive(SCOPES):
    store = file.Storage('../personal_token.json')
    creds = store.get()
    return build('drive', 'v3', http=creds.authorize(Http()))
​
def gdrive_download(file_id):
    request = drive_service.files().get(fileId=file_id)
    result = request.execute()

    #will return metadata of file but I will only get file name
    file_name = result['name']
    print(f"File name is {file_name}")

    #will get actual file
    request = drive_service.files().get_media(fileId=file_id)
    result = request.execute()
    print("Downloading " + file_name)

    #will write file using the file_name
    with open(file_name, mode="wb") as f:
        f.write(result)
    print("Finished writing " + file_name)
​
drive_service = login_gdrive(SCOPES)
​
gdrive_download('1oiD6h-ixAUTIWebEdN-jV8MO0sssoQTI')


out...  File name is sample_data_2018-10-21.csv
out...  Downloading sample_data_2018-10-21.csv
out...  Finished writing sample_data2018-10-21.csv
0 голосов
/ 07 сентября 2018

Я собираюсь предположить, что вы не объединили эти два файла. Второму сценарию требуется служба (переменная) в вашем первом сценарии, чтобы их можно было объединить.

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

# If modifying these scopes, delete the file token.json.
SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'

def main():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    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()))

    # Call the Drive v3 API
    rfile_id = '1wzCjl51u131v1KBgpbiKLJs8DPPakhXCFosfYjp7BY0'
    request = 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()
...