谷歌驱动API下载文件-python-没有下载文件

Posted

技术标签:

【中文标题】谷歌驱动API下载文件-python-没有下载文件【英文标题】:Google drive API download files - python - no files downloaded 【发布时间】:2016-07-10 11:02:03 【问题描述】:

我尝试了多种方法通过 oauth 和 API 从谷歌驱动器下载文件,但是我无法下载文件。我相信我已经正确验证了。运行我的代码后,似乎下载文件成功(没有错误),但没有下载文件。

这是我目前尝试过的代码:

def download_file(file_id, mimeType):
    if "google-apps" in mimeType:
        return
    request = drive_service.files().get(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)

但是,这会导致“下载 100%”。正在打印到控制台,但没有下载文件。

我也试过了:

def download2(download_url):
    resp, content = drive_service._http.request(download_url)
    if resp.status == 200:
        print 'Status: %s' % resp
        return content
    else:
        print 'An error occurred: %s' % resp
        return None

这也不会产生下载的文件,但它确实给了我一条 200 消息。

这两者似乎都在正确地与 API 联系。是否需要执行其他步骤才能真正获取计算机上的文件?

编辑:

这是我的代码的其余部分:

import json
import webbrowser

import httplib2
import io
from apiclient.http import MediaIoBaseDownload

from apiclient import discovery
from oauth2client import client

if __name__ == '__main__':
  flow = client.flow_from_clientsecrets(
    'client_secrets.json',
    scope='https://www.googleapis.com/auth/drive.readonly',
    redirect_uri='urn:ietf:wg:oauth:2.0:oob')

  auth_uri = flow.step1_get_authorize_url()
  webbrowser.open(auth_uri)

  auth_code = raw_input('Enter the auth code: ')

  credentials = flow.step2_exchange(auth_code)
  http_auth = credentials.authorize(httplib2.Http())

  drive_service = discovery.build('drive', 'v3', http_auth) #also tried v2
  files = drive_service.files().list().execute()
  for f in files['files']:
    #call one of the two download methods with the proper arguments

【问题讨论】:

【参考方案1】:

从 BytesIO 更改为 FileIO 允许实际下载文件。这是我将代码修改为:

fh = io.FileIO(filename, 'wb')

这是允许我下载文件的完整代码:

def download_file(file_id, mimeType, filename):
    if "google-apps" in mimeType:
        # skip google files
        return
    request = drive_service.files().get_media(fileId=file_id)
    fh = io.FileIO(filename, 'wb')
    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__':
    flow = client.flow_from_clientsecrets(
      'client_secrets.json',
      scope='https://www.googleapis.com/auth/drive.readonly',
      redirect_uri='urn:ietf:wg:oauth:2.0:oob')

    auth_uri = flow.step1_get_authorize_url()
    webbrowser.open(auth_uri)

    print auth_uri

    auth_code = raw_input('Enter the auth code: ')

    credentials = flow.step2_exchange(auth_code)
    http_auth = credentials.authorize(httplib2.Http())

    drive_service = discovery.build('drive', 'v3', http_auth)
    files = drive_service.files().list().execute()
    for f in files['files']:
        print f['name']
        download_file(f['id'], f['mimeType'], f['name'])

【讨论】:

没有。发生的情况是 auth_uri 将是一个生成的 url,您需要将其发送给驱动器帐户的所有者。当他们访问该链接时,他们必须批准您,然后将获得一个代码,他们必须将其返回给您。然后,您将输入该代码。请注意,该代码仅在有限的时间内(可能 15 分钟)有效一次。 是的 fh = io.FileIO(filename, 'wb') 为我工作,谢谢。【参考方案2】:

文件正在下载,但是google给出的例子对文件没有做任何事情。

您只需要像这样返回 BytesIO 缓冲区的内容(只需在末尾添加一个 return)...

def download_file(service, file_id):
    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))
    return fh.getvalue()

【讨论】:

hrmm,所以我在 download_file 函数的末尾添加了 open(filename, 'wb') 作为输出:fh.seek(0) output.write(fh.read())。但它只是下载文件的元数据。 @user1253952 html = download_file(service,'file_id') with open('file.csv', 'wb') as f: f.write(html) 谢谢,由于某种原因,fh.read() 不起作用,但 fh.getvalue() 起作用。 这是一个缓冲区。看看这个参考:docs.python.org/3/library/io.html#io.BytesIO.getbuffer

以上是关于谷歌驱动API下载文件-python-没有下载文件的主要内容,如果未能解决你的问题,请参考以下文章

谷歌推动宁静的api

从谷歌驱动器wget / curl大文件

使用命令行从谷歌驱动器下载共享文件的最快方法是啥? [关闭]

无论如何要在不下载的情况下解压缩谷歌驱动器中的 zip 或 tar

使用 wget 从谷歌驱动器下载文件

是否可以在不先将对象作为文件保存到谷歌驱动器的情况下从谷歌 colab 下载对象作为文件?