如何在Python开发的Telegram Bot中免本地存储访问Google Drive文件?
解决方案
一、无需本地存储凭证文件完成Google Drive授权
可以通过环境变量存储凭证内容替代本地JSON文件,具体实现如下:
- 将服务账号的JSON凭证完整内容复制到服务器的环境变量中(比如命名为
GOOGLE_SERVICE_ACCOUNT_JSON) - 在Python代码中读取环境变量并解析为字典,直接用于授权,示例代码:
import os import json from google.oauth2 import service_account from googleapiclient.discovery import build # 从环境变量读取凭证内容并解析 cred_dict = json.loads(os.getenv("GOOGLE_SERVICE_ACCOUNT_JSON")) credentials = service_account.Credentials.from_service_account_info( cred_dict, scopes=["https://www.googleapis.com/auth/drive.readonly"] ) # 构建Drive API客户端 drive_service = build("drive", "v3", credentials=credentials)
如果使用OAuth 2.0授权(非服务账号),也可将客户端ID、刷新令牌等关键信息存入环境变量,直接在代码中构造凭证对象,无需依赖本地文件。
二、无需保存文件直接读取Drive中的xlsx
利用Google Drive API的get_media方法获取文件字节流,通过io.BytesIO包装为类文件对象,直接传给Excel处理库读取,示例代码:
import io import pandas as pd def load_drive_xlsx(file_id): # 获取文件字节流 media_request = drive_service.files().get_media(fileId=file_id) file_stream = io.BytesIO(media_request.execute()) # 直接读取为DataFrame(pandas示例) return pd.read_excel(file_stream) # 使用示例:替换为你的目标文件ID xlsx_data = load_drive_xlsx("your_target_file_id") print(xlsx_data.head())
如果使用openpyxl,同样支持直接传入BytesIO对象:
from openpyxl import load_workbook file_stream = io.BytesIO(media_request.execute()) workbook = load_workbook(filename=file_stream) worksheet = workbook.active
内容的提问来源于stack exchange,提问作者Julia Sizova
相关产品推荐
相关产品推荐

