使用Drive v3将电子表格导出为text / csv会产生500内部错误

时间:2016-01-04 22:52:00

标签: python google-drive-api

我尝试使用适用于Python的Google客户端库以csv格式导出Google电子表格:

# OAuth and setups...
req = g['service'].files().export_media(fileId=fileid, mimeType=MIMEType)
fh = io.BytesIO()
downloader = http.MediaIoBaseDownload(fh, req)
# Other file IO handling...

适用于MIMEType:application / pdf,MS Excel等。

根据Google's documentation,支持text/csv。但是当我尝试发出请求时,服务器会提供500 Internal Error

即使使用谷歌的Drive API playground,也会出现同样的错误。

尝试:

与v2一样,我添加了一个字段:

  

gid = 0

指向工作表的请求,但这是一个错误的请求。

2 个答案:

答案 0 :(得分:3)

这是Google代码中的已知错误。 https://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=4289

但是,如果你手动建立自己的请求,你可以以字节为单位下载整个文件(媒体管理的东西不会起作用)。

file作为文件ID,您http作为您授权的http对象,可以下载文件:

from apiclient.http import HttpRequest
def postproc(*args):
    return args[1]
data = HttpRequest(http=http,
                   postproc=postproc,
                   uri='https://docs.google.com/feeds/download/spreadsheets/Export?key=%s&exportFormat=csv' % file,
                   headers={ }).execute()

data这是一个包含CSV的字节对象。你可以打开它:

import io
lines = io.TextIOWrapper(io.BytesIO(data), encoding='utf-8', errors='replace')
for line in lines:
    #Do whatever

答案 1 :(得分:2)

您只需要实施Exponential Backoff

查看ExponentialBackOffPolicy的文档。

  

这个想法是服务器暂时不可用,并且在他们试图重新启动时不应该被淹没。

     

默认实施要求退回500和503状态代码。如果需要不同的状态代码,则子类可以覆盖。

以下是第一个链接的指数退避实现的片段:

ExponentialBackOff backoff = ExponentialBackOff.builder()
.setInitialIntervalMillis(500)
.setMaxElapsedTimeMillis(900000)
.setMaxIntervalMillis(6000)
.setMultiplier(1.5)
.setRandomizationFactor(0.5)
.build();
request.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(backoff));

您可能需要查看此文档以获取ExponentialBackoff implementation的摘要。