pyexcel突然无法打开.xlsx/.xls文件提示Unsupported file type错误
问题根因
这个报错是多个兼容问题、写法问题叠在一起导致的,和业务代码逻辑无关:
- 已安装依赖缺失xlsx格式对应的解析插件
pyexcel-xlsx,本身就不具备xlsx文件解析能力 - 你使用的
pyexcel==0.7.0、pyexcel-io==0.6.6版本组合存在兼容缺陷:当环境中xlrd版本≥2.0.0、chardet版本≥5.0.0时,会直接跳过所有已安装的格式解析插件加载流程,哪怕装了xls解析插件也识别不到 - 传入
pathlib.Path对象给file_name参数时,该版本pyexcel只接受字符串格式路径,不会自动解析Path对象的文件后缀,直接判定为未知文件类型 - 文件流读取写法错误:打开xls/xlsx这类二进制文件必须用
rb二进制读取模式,你用了文本模式r读出来的内容是损坏的;且传文件流时参数名应为file_stream,不是file_name
修复步骤
按顺序操作即可:
- 先把有兼容问题的相关依赖完全卸载
pip uninstall -y pyexcel pyexcel-io pyexcel-xls pyexcel-xlsx pyexcel-ezodf xlrd chardet
- 安装固定兼容版本的依赖,以下版本组合经过验证不存在兼容问题:
pip install pyexcel==0.7.0 pyexcel-io==0.6.6 pyexcel-xls==0.7.0 pyexcel-xlsx==0.6.0 xlrd==1.2.0 chardet==4.0.0
- 修正代码里的错误写法,参考正确示例:
from pathlib import Path import pyexcel # 读取本地路径文件的写法,必须把Path对象转成字符串,老版本pyexcel不认Path类型 p = Path("data/jr1305221.xls") book = pyexcel.get_book(file_name=str(p)) # 传文件流读取的正确写法 with open("data/dummy.xlsx", "rb") as f: book = pyexcel.get_book(file_stream=f)
补充说明:上周代码正常现在突然报错,基本是因为没锁依赖版本,pip自动升级了xlrd、chardet这类间接依赖,新版本不兼容老版pyexcel导致的。本地和Docker部署时都要把所有依赖版本固定死,不要加
--upgrade参数更新pyexcel相关的包,也不要把xlrd升到2.0.0以上,该版本砍掉了xls之外所有格式的解析支持,装了必报错。
内容的提问来源于stack exchange,提问作者ron_g
相关产品推荐
相关产品推荐

