【问题标题】:downloading file from google drive using api( NameError: name 'service' is not defined)使用 api 从谷歌驱动器下载文件(名称错误:名称“服务”未定义)
【发布时间】:2018-09-06 20:41:41
【问题描述】:
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))

id 是从 https://docs.google.com/document/d/1wzCjl51u131v1KBgpbiKLJs8DPPakhXCFosfYjp7BY0/edit?usp=sharing

请求 = 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

【问题讨论】:

  • 您必须像这样定义服务函数: service = build('drive', 'v3', http=creds.authorize(Http())) 它是在 main() 函数中定义的。其他功能不知道“服务”是什么。
  • 在哪里添加 service = build('drive', 'v3', http=creds.authorize(Http()))
  • 在你使用的函数里面
  • 不合并两个文件,(quickstart.py) 和 (download.py) 这里 download.py 上面的第一行 file_id service = build('drive', 'v3', http=creds.authorize( Http())) 得到 NameError: name 'build' is not defined
  • 关于合并 py 文件并在 else 语句后在 file_id 之前添加行 NameError: name 'io' is not defined

标签: python google-api google-drive-api google-oauth google-api-python-client


【解决方案1】:

我将不得不假设您没有合并这两个文件。第二个脚本需要您的第一个脚本中的服务(变量)才能运行,它们应该被合并。

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()

【讨论】:

  • 第 23 行,在 main fh = io.BytesIO() NameError: name 'io' is not defined ,有拼写错误 rfile_id ,我改为 file_id
  • 文档字符串显示“打印用户有权访问的前 10 个文件的名称和 ID。”此代码不会这样做。
【解决方案2】:

这是我的做法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多