
本文介绍解决 pandas `read_excel` 函数因直接传入字节数据(bytes)而触发弃用警告的问题,推荐使用 `bytesio` 封装字节流作为标准、安全且兼容性良好的替代方案。
当从云存储(如 Azure Blob Storage、AWS S3)或内存中读取 Excel 文件时,常通过 .readall() 或 .read() 获取原始字节(bytes),但新版 pandas 已明确弃用将 bytes 直接传入 pd.read_excel() 的用法——这会触发 FutureWarning,并在未来版本中彻底移除支持。
✅ 正确做法是:将字节数据包装为类文件对象(file-like object),最常用且轻量的方式是使用 Python 标准库中的 BytesIO:
from io import BytesIO import pandas as pd # 假设 blob_data 是一个支持 readall() 的二进制数据源(如 Azure BlobClient) excel_bytes = blob_data.readall() # type: bytes df = pd.read_excel(BytesIO(excel_bytes), engine='openpyxl')
? 关键说明:
- BytesIO 是内存中的二进制流对象,pandas.read_excel 可以像处理本地文件路径或打开的文件句柄一样处理它;
- 必须指定 engine='openpyxl'(尤其对 .xlsx 文件),因为默认引擎 xlrd 已不再支持 .xlsx(自 v2.0 起仅支持 .xls);
- 若需读取 .xls 文件,可改用 engine='xlrd'(需安装 xlrd
⚠️ 注意事项:
- 避免重复调用 blob_data.readall() 多次(如误写为 BytesIO(blob_data.readall()) 和 pd.read_excel(...) 分开执行),因某些 blob 客户端流只支持单次读取;
- 如遇 ValueError: No engine found,请确认已安装对应引擎:pip install openpyxl(推荐)或 pip install pyxlsb(用于 xlsb);
- 对于超大 Excel 文件,建议结合 chunksize 参数分块读取,避免内存峰值:
for chunk in pd.read_excel(BytesIO(excel_bytes), engine='openpyxl', chunksize=1000): process(chunk)
该方案无需更换库,兼容所有主流 pandas 版本(≥1.4.0),是当前最简洁、稳定、符合官方推荐的实践方式。










