如何在不下载文件的情况下将Google电子表格的内容读入Pandas数据框?
我认为gspread或df2gspread可能是很好的解决方案,但到目前为止,我一直在使用pydrive,并接近解决方案。
使用Pydrive,我设法获得了电子表格的导出链接,格式为.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
现在,如果我点击这些链接(或使用webbrowser.open(url)
访问它们),我就 * 下载 * 了文件,然后我可以使用pandas.read_excel()
或pandas.read_csv()
正常地将其读入Pandas Dataframe ,如here所述。
如何跳过下载,直接从这些链接将文件读入 Dataframe ?
我尝试了几种解决方案:
- The obvious
pd.read_csv(url)
给出
pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 6, saw 2
有趣的是,这些数字(1, 6, 2
)并不依赖于电子表格中的行数和列数,这暗示着脚本试图读取的不是它想要读取的内容。
- 模拟量
pd.read_excel(url)
给出
ValueError: Excel file format cannot be determined, you must specify an engine manually.
并且指定例如engine = 'openpyxl'
给出
zipfile.BadZipFile: File is not a zip file
- BytesIO解决方案看起来很有前途,但是
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'
2条答案
按热度按时间ccrfmcuu1#
在您的情况下,如何进行以下修改?在这种情况下,通过从
gauth
检索访问令牌,电子表格被导出为XLSX数据,XLSX数据被放入 Dataframe 。修改的脚本:
import requests
。values = pd.read_excel(BytesIO(res.content))
,如下所示。3gtaxfhh2#
我想为@Tanaike的精彩回答贡献一个额外的选项。确实成功获得excel文件是相当困难的(来自drive的.xlsx,而不是google的表单)导入到python环境中,而不需要将内容发布到Web上。(),我通常在colab/jupyter笔记本中使用不同的认证方法,改编自googleapis文档,在我的环境中使用BytesIO(response.content)是不必要的。