无需下载从谷歌云端硬盘读取xlsx到Pandas遇阻求助
解决方法
错误原因
你直接访问的/export URL未经过服务账号认证,返回的是Google Sheets的登录跳转页面(HTML内容),而非实际的XLSX文件——XLSX本质是压缩包格式,因此openpyxl会抛出zipfile.BadZipFile错误。
解决方案:通过Drive API+服务账号认证获取XLSX流
利用Google Drive API,通过服务账号认证后直接导出并读取XLSX内容,无需下载到本地文件。
1. 安装依赖包
pip install google-api-python-client oauth2client pandas openpyxl
2. 完整代码实现
import pandas as pd from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseDownload from oauth2client.service_account import ServiceAccountCredentials import io # 配置参数 SERVICE_ACCOUNT_KEY_PATH = "你的服务账号密钥文件路径.json" SHEET_ID = "目标Google Sheet的ID" # 初始化服务账号认证 scopes = ["https://www.googleapis.com/auth/drive.readonly"] credentials = ServiceAccountCredentials.from_json_keyfile_name( SERVICE_ACCOUNT_KEY_PATH, scopes ) drive_service = build("drive", "v3", credentials=credentials) # 导出XLSX格式的文件流 export_request = drive_service.files().export_media( fileId=SHEET_ID, mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) file_stream = io.BytesIO() downloader = MediaIoBaseDownload(file_stream, export_request) # 流式下载内容 done = False while not done: status, done = downloader.next_chunk() # 重置流指针到起始位置,供pandas读取 file_stream.seek(0) # 读取为DataFrame df = pd.read_excel(file_stream, engine="openpyxl") print(df.head())
3. 关键注意事项
- 权限配置:必须将服务账号密钥文件中
client_email字段对应的邮箱,添加为目标Google Sheet的「查看者」或「编辑者」,否则会触发权限不足错误。 - MIME类型:导出时指定的
mimeType是标准XLSX格式,确保返回的是可被openpyxl解析的压缩包内容。
内容的提问来源于stack exchange,提问作者Solrac
相关产品推荐
相关产品推荐

