通过Google Drive API获取Excel所有工作表数据并转为DataFrame
解决方案:无需本地下载访问Google Drive中Excel文件的多工作表数据
问题分析
原代码存在两个核心问题:
- 在文件未完全下载的循环过程中就调用
pd.read_excel,可能导致读取不完整或报错 - 未指定
sheet_name参数,默认仅读取第一个工作表
修正后的实现代码
import io import pandas as pd from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseDownload def get_excel_data(creds, sheet_id): # 构建Drive服务 service = build('drive', 'v3', credentials=creds) # 完整下载文件到BytesIO request = service.files().get_media(fileId=sheet_id) file_io = io.BytesIO() downloader = MediaIoBaseDownload(file_io, request) done = False while not done: status, done = downloader.next_chunk() # 重置文件指针到开头(下载后指针停在末尾,需重置才能读取) file_io.seek(0) # 加载Excel文件对象,获取所有工作表名称 excel_file = pd.ExcelFile(file_io, engine='openpyxl') sheet_names = excel_file.sheet_names # 定义获取指定工作表DataFrame的函数 def get_sheet_df(sheet_name): return excel_file.parse(sheet_name) return sheet_names, get_sheet_df
使用示例
# 假设已通过服务账号获取到合法的creds对象 sheet_names, get_df = get_excel_data(creds, "你的Google Drive文件ID") # 打印所有工作表名称 print("所有工作表:", sheet_names) # 获取指定工作表的DataFrame df_sheet1 = get_df("Sheet1") df_sheet2 = get_df("Sheet2")
关键说明
- 完整下载文件:必须等待
downloader.next_chunk()完成后再处理文件,避免读取不完整的数据流 - 重置文件指针:BytesIO在写入后指针会停在末尾,必须用
seek(0)重置到开头才能被pd.ExcelFile正确读取 - ExcelFile对象:通过
pd.ExcelFile加载文件后,可以高效获取所有工作表名称,并且按需解析指定工作表,无需重复下载文件 - 依赖安装:确保已安装
openpyxl库(执行pip install openpyxl),用于处理.xlsx格式文件
内容的提问来源于stack exchange,提问作者Solrac
相关产品推荐
相关产品推荐

