如何通过Google Drive API直接导出dataframe至Google Drive无需本地保存
方案结论
完全可以实现无本地落盘的上传流程,核心思路是用内存字节流承接pandas生成的xlsx二进制内容,直接作为上传payload传给Google Drive API,全程不会在本地磁盘生成任何临时文件。
依赖安装
先安装需要的第三方库,执行命令:pip install pandas openpyxl google-api-python-client google-auth
实现代码
import io import pandas as pd from google.oauth2 import service_account from googleapiclient.discovery import build from googleapiclient.http import MediaIoBaseUpload # -------------------------- # 1. 初始化认证与Drive服务 # -------------------------- # 替换为你自己的凭证json文件路径 SCOPES = ['https://www.googleapis.com/auth/drive.file'] SERVICE_ACCOUNT_FILE = '你的认证凭证.json' creds = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES ) service = build('drive', 'v3', credentials=creds) # -------------------------- # 2. 内存中生成xlsx,不写本地 # -------------------------- # 这里替换成你自己的DataFrame df = pd.DataFrame({'列1': [1,2,3], '列2': ['a','b','c']}) # 初始化内存字节流 buffer = io.BytesIO() # 把df写入内存流,用openpyxl作为xlsx写入引擎 with pd.ExcelWriter(buffer, engine='openpyxl') as writer: df.to_excel(writer, index=False, sheet_name='数据') # 关键操作:把流指针移到起始位置,否则上传会是空文件 buffer.seek(0) # -------------------------- # 3. 直接上传内存流到Drive # -------------------------- # 配置上传文件元数据 file_metadata = { 'name': '导出的数据表.xlsx', # 上传到Drive后的文件名 # 可选:指定上传到的目标文件夹ID,不填则传到根目录 # 'parents': ['你要存放的目标文件夹ID'] } # 构建媒体上传对象,直接传内存流,指定正确的MIME类型 media = MediaIoBaseUpload( buffer, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', resumable=True ) # 执行上传 file = service.files().create( body=file_metadata, media_body=media, fields='id, name, webViewLink' ).execute() print(f"上传完成,文件ID:{file.get('id')},访问链接:{file.get('webViewLink')}")
注意事项
- 如果你用的是服务账号认证,需要提前给目标上传文件夹授予服务账号邮箱的编辑权限,否则会触发403权限错误;如果用的是OAuth个人账号认证则不需要这一步
- 内存流写入完成后必须执行
buffer.seek(0)重置指针位置,否则上传的xlsx文件会是0字节的损坏文件 - 不需要手动关闭BytesIO流,上传完成后会随垃圾回收自动释放内存,无资源泄漏问题
- 该方案内存占用和你导出的xlsx文件大小正相关,常规大小的表格完全不会有性能问题
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

