python - 尽管添加了正确的范围,但带有 Python 的 Google Drive API 仍不允许文件下载
问题描述
我已按照Google 提供的使用 Python的快速入门,并使用 Google 提供的适当范围从 Drive https://www.googleapis.com/auth/drive.readonly下载文件,但我不断收到错误消息:
googleapiclient.errors.HttpError: https://www.googleapis.com/drive/v3/files/1RWpLGCWldcJyVqa0tIVlScg60ExEtcNIvJ7R9M8DuhM?alt=media 返回“只能下载包含二进制内容的文件。将导出与 Google Docs 文件一起使用。”
当我尝试运行代码来下载文件时。
我可以读取驱动器上的文件,但我似乎无法从驱动器下载特定的电子表格,尽管我尽了最大努力。下面是我的代码(经过编辑的文件路径和一些评论),用于通过 API 建立连接:
def gsuite_connect():
file_path = 'OMITTED/Loading'
# Get what permissions the user (using the API) will need. This as been set to high level
# access by default
scopes = ['https://www.googleapis.com/auth/drive.readonly']
# Access the tokens for G Suite to access the Drive. Ensure that if this file previous exists,
# that it is in the current working directory
store = file.Storage(os.path.join(file_path, 'storage.json'))
# Access the credentials for the Drive API
creds = store.get()
if not creds or creds.invalid:
print("\nUsing credentials found in client_id(secret).json")
flow = client.flow_from_clientsecrets(os.path.join(file_path, 'client_id.json'), scopes)
creds = tools.run_flow(flow, store)
http = creds.authorize(Http())
drive = discovery.build('drive', 'v3', http=http)
sheets = discovery.build('sheets', 'v4', http=http)
return drive, sheets
这是我用于根据Google 提供的内容下载文件的功能(编辑的文件路径和一些评论) :
def get_datalog(self):
dir_path = 'OMITTED/Downloads'
fname = "'FILENAME'"
files = self.drive.files().list(q="name = {}".format(fname),
fields="nextPageToken, files(id, name)").execute()
items = files.get('files', [])
# Error checking and subsequent downloading if file successfully found
if not items:
exit()
else:
# Change into the desired directory for storing the file and download file based on the
# retrieved ID
os.chdir(dir_path)
file_id = items[0]['id']
# Request download service
request = self.drive.files().get_media(fileId=file_id)
fh = io.FileIO(fname, mode='w')
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print("Download %d%%." % int(status.progress() * 100))
# Return the file path
return os.path.join(dir_path, fname)
帮助将不胜感激!我不想显示敏感文件,例如 client_id.json 或任何其他凭据,但如果您需要更多信息,请告诉我!
解决方案
- 您想使用带有 python 的 google-api-python-client 下载 Google Docs(在您的情况下,它是电子表格。)。
- 你想知道错误的原因
Only files with binary content can be downloaded. Use Export with Google Docs files.
- 您已经能够使用 Drive API。
如果我的理解是正确的,这个答案怎么样?
修改点:
- 当通过
get_media
方法下载Google Docs文件时,会出现这样的错误。- 在
get_media
方法的情况下,可以下载除Google Docs(电子表格、文档、幻灯片等)以外的文件。
- 在
- 当您想下载 Google Docs 文件时,请使用
export_media
方法。- 在这种情况下,由于 Google 方面的规范,无法下载原始 Google Docs。所以请把它转换成其他格式。例如,在电子表格的情况下,它是 Excel 格式、CSV 格式等。
修改后的脚本:
为了避免这个问题,下面的修改怎么样?
从:request = self.drive.files().get_media(fileId=file_id)
至:
request = self.drive.files().export_media(fileId=file_id, mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
- 在这种情况下,Google 电子表格将作为 Excel 文件下载。如果要将其下载为 CSV,请将 mimeType 修改为
text/csv
.
笔记:
- 在这种情况下,它假定您要下载的 Google 文档文件是您的或公开共享的。
参考:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
添加:
关于更改访问令牌范围的方法,请重命名或删除storage.json
脚本中的文件,然后再次运行脚本。这样,您可以重新授权新范围和创建包括令牌的新文件。您可以将访问令牌与新范围一起使用。
推荐阅读
- css - CSS 绘制顺序属性的 SVG 问题
- python - 将数据描述符传递给函数
- python - 允许多个客户端监听 ThreadedHTTPServer python 3
- ios - 如何在 Swift 4 中将 2 个布尔值组合在一起
- javascript - 如何为foreach循环中的每个数据打开一个带有按钮的模式?
- django - 如何在模板Django中增加变量
- java - Spring - FlatFileItemReader 与 FixedLengthTokenizer 的使用
- c++ - 对内部类的静态实例的未定义引用
- c# - 抽象类构造函数
- java - 如何将其出现的参数设置为 jdbcTemplate 查询函数?