在pandas数据框中阅读google电子表格

时间:2018-05-11 22:42:14

标签: python oauth google-sheets gspread

对API身份验证不太熟悉,但我无法弄清楚如何通过Python阅读Google Sheet共享。

我试过了:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name('/Users/alexiseggermont/Downloads/Accountable-7b29dac08324.json', scope)

gc = gspread.authorize(credentials)

wks = gc.open("mysheet").sheet1

这会在第2行给我ImportError: cannot import name 'opentype'

然后我尝试了:

import oauth2client.client, oauth2client.file, oauth2client.tools
import gspread

flow = oauth2client.client.OAuth2WebServerFlow(client_id, client_secret, 'https://spreadsheets.google.com/feeds')
storage = oauth2client.file.Storage('credentials.dat')
credentials = storage.get()
if credentials is None or credentials.invalid:
    import argparse
    flags = argparse.ArgumentParser(parents=[oauth2client.tools.argparser]).parse_args([])
    credentials = oauth2client.tools.run_flow(flow, storage, flags)

gc = gspread.authorize(credentials)

# when this cell is run, your browser will take you to a Google authorization page.
# this authorization is complete, the credentials will be cached in a file named credentials.dat

这会打开一个窗口,询问我是否要让我的应用程序访问我的工作表,然后单击是。但后来sheet = gc.open("mysheet").sheet1给了我一个权限错误:

APIError: {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "insufficientPermissions",
    "message": "Insufficient Permission"
   }
  ],
  "code": 403,
  "message": "Insufficient Permission"
 }
}

我发现解决此错误的唯一建议是更改范围'变量,但该代码中没有使用范围变量,所以我很困惑。

2 个答案:

答案 0 :(得分:1)

您可以使用空格添加多个范围。你可以尝试以下修改吗?

来自:

lower()

致:

flow = oauth2client.client.OAuth2WebServerFlow(client_id, client_secret, 'https://spreadsheets.google.com/feeds')

注意:

  • 在运行修改过的脚本之前,请删除flow = oauth2client.client.OAuth2WebServerFlow(client_id, client_secret, 'https://spreadsheets.google.com/feeds https://www.googleapis.com/auth/drive') 。这样,credentials.dat就是使用新范围创建的。
  • 在我的环境中,我确认当范围仅为credentials.dat时,会发生同样的错误。当范围为https://spreadsheets.google.com/feeds时,不会发生错误。

如果这对你的情况没用,我很抱歉。

答案 1 :(得分:0)

还有Gspread-Pandas库本身,其中的文档以简单的方式对Oauth部分进行了简单介绍: https://github.com/aiguofer/gspread-pandas

  

使用前,您需要为您的应用下载Google客户端凭据。

     

客户端凭据要允许脚本使用Google Drive API,我们需要   对Google进行自我认证。为此,我们需要创建一个   项目,描述工具并生成凭据。请使用   网络浏览器,然后转到Google控制台,然后:

     

在顶部的弹出菜单中选择“创建项目”。出现一个对话框,   因此,为您的项目命名,然后单击“创建”按钮。在   在左侧菜单上,单击API Manager。可用的API的表格是   如图所示。切换Drive API,然后单击Enable API按钮。照着做   用于表格API。为了我们的目的,可能会关闭其他API。上   在左侧菜单上,单击“凭据”。在OAuth同意部分   屏幕上,选择您的电子邮件地址并为您的产品命名。然后   单击保存按钮。在“凭据”部分中,单击“添加凭据”   并切换OAuth 2.0客户端ID。出现对话框创建客户ID。   选择应用程序类型项作为其他。单击创建按钮。请点击   在创建的OAuth 2.0客户端右侧的Download JSON图标上   标识并将下载的文件存储在文件系统上。请成为   请注意,该文件包含您的私人凭据,因此请注意   以与您的私密SSH密钥相同的方式进行归档;即搬家   将JSON下载到〜/ .config / gspread_pandas / google_secret.json(或者您   可以通过直接调用来配置目录和文件名   gspread_pandas.conf.get_config多亏了类似的项目df2gspread   关于如何获取客户端凭据的详细说明。

     

用户凭证一旦拥有了客户端凭证,就可以拥有   多个用户凭据存储在同一台计算机上。这可以是   拥有共享服务器(例如使用Jupyter)时非常有用   笔记本服务器),其中有多个人可能想要使用   图书馆。 Spread的第一个参数必须是标识   用户的凭证。首次要求使用特定密钥时,   您将必须通过基于文本的OAuth提示进行身份验证;这个   使得可以通过ssh或通过   Jupyter笔记本。此后,该用户的凭据将为   存储(默认情况下存储在〜/ .config / gspread_pandas / creds中,也可以   在GSPREAD_PANDAS_CONFIG_DIR env var中手动设置它和令牌   使用该工具时,它将自动刷新。

     

用户将只能与他们拥有的电子表格进行交互   访问。

     

处理身份验证在后端,库正在利用   Google's oauth2client <http://oauth2client.readthedocs.io/en/latest/ __处理   身份验证。如上所述,它可以方便地存储所有内容   这样您就不必担心要处理的样板代码   授权但是,如果您需要自定义身份验证的方式   您可以通过几种不同的方式进行操作。您可以更改目录   使用GSPREAD_PANDAS_CONFIG_DIR env存储所有内容的位置   变种您也可以生成自己的   oauth2client.client.OAuth2Credentials并将它们传递给   实例化Client或Spread对象。其他自定义方式   身份验证,请参见gspread_pandas.conf.get_config和   gspread_pandas.conf.get_creds