信息发布→ 登录 注册 退出

如何在不直接传递字节对象的情况下读取 Excel 文件

发布时间:2026-01-09

点击量:

本文介绍解决 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),是当前最简洁、稳定、符合官方推荐的实践方式。

标签:# excel  # python  # 字节  # 云存储  # 标准库  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!