Google 电子表格通过 Pydrive 到 Pandas 数据框,无需下载

Google spreadsheet to Pandas dataframe via Pydrive without download

如何在不下载文件的情况下将 Google 电子表格的内容读入 Pandas 数据框?


我认为 gspread or df2gspread may be good shots, but I've been working with pydrive 到目前为止并且接近解决方案。

使用 Pydrive,我设法将我的电子表格导出 link,作为 .csv.xlsx 文件。身份验证过程后,这看起来像


    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()
    drive = GoogleDrive(gauth)
    
    # choose whether to export csv or xlsx
    data_type = 'csv'
    
    # get list of files in folder as dictionaries
    file_list = drive.ListFile({'q': "'my-folder-ID' in parents and 
    trashed=false"}).GetList()
    
    export_key = 'exportLinks'
    
    excel_key = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    csv_key = 'text/csv'
    
    if data_type == 'excel':
        urls = [ file[export_key][excel_key] for file in file_list ]
    
    elif data_type == 'csv':
        urls = [ file[export_key][csv_key] for file in file_list ]

我为 xlsx 得到的 url 的类型是

https://docs.google.com/spreadsheets/export?id=my-id&exportFormat=xlsx

csv

也类似
https://docs.google.com/spreadsheets/export?id=my-id&exportFormat=csv

现在,如果我单击这些 link(或使用 webbrowser.open(url) 访问它们),我 下载 文件,然后我可以正常使用 pandas.read_excel()pandas.read_csv() 读入 Pandas 数据帧,如 here.

所述

如何跳过下载,直接从这些 link 中将文件读入数据帧?

我尝试了几种解决方案:

    pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 6, saw 2

有趣的是,这些数字 (1, 6, 2) 不依赖于我的电子表格中的行数和列数,这表明脚本试图读取的内容并非其预期内容。

    ValueError: Excel file format cannot be determined, you must specify an engine manually.

并指定例如engine = 'openpyxl' 给出

zipfile.BadZipFile: File is not a zip file

    r = requests.get(url)
    data = r.content
    df = pd.read_csv(BytesIO(data))

还是给


    pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 6, saw 2

如果我print(data)我得到数百行html代码


    b'\n<!DOCTYPE html>\n<html lang="de">\n  <head>\n  <meta charset="utf-8">\n  <meta content="width=300, initial-scale=1" name="viewport">\n 
    ...
    ...
     </script>\n  </body>\n</html>\n'

你的情况,下面的修改怎么样?在这种情况下,通过从 gauth 检索访问令牌,将电子表格导出为 XLSX 数据,并将 XLSX 数据放入数据框。

修改后的脚本:

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

url = "https://docs.google.com/spreadsheets/export?id={spreadsheetId}&exportFormat=xlsx"
res = requests.get(url, headers={"Authorization": "Bearer " + gauth.attr['credentials'].access_token})
values = pd.read_excel(BytesIO(res.content))
print(values)
  • 在此脚本中,请添加import requests

  • 在这种情况下,使用 XLSX 数据的第一个选项卡。

  • 如果要使用其他标签,请按如下方式修改values = pd.read_excel(BytesIO(res.content))

      sheet = "Sheet2"
      values = pd.read_excel(BytesIO(res.content), sheet_name=sheet)