使用xlrd打开.xlsx转存的.xls文件时触发断言错误assert _unused_i == nstrings -1
解决xlrd读取转换后.xls文件的AssertionError问题
问题描述
用xlrd编写的脚本可正常处理多数原生.xls文件,但将.xlsx文件转换为.xls格式后,调用xlrd.open_workbook()时触发如下断言错误:
Traceback (most recent call last): File "/home/troublebucket/Projects/script.py", line 51, in <module> wb = xlrd.open_workbook(bom_table_wb) File "/home/troublebucket/.local/lib/python3.10/site-packages/xlrd/__init__.py", line 172, in open_workbook bk = open_workbook_xls( File "/home/troublebucket/.local/lib/python3.10/site-packages/xlrd/book.py", line 104, in open_workbook_xls bk.parse_globals() File "/home/troublebucket/.local/lib/python3.10/site-packages/xlrd/book.py", line 1211, in parse_globals self.handle_sst(data) File "/home/troublebucket/.local/lib/python3.10/site-packages/xlrd/book.py", line 1178, in handle_sst self._sharedstrings, rt_runlist = unpack_SST_table(strlist, uniquestrings) File "/home/troublebucket/.local/lib/python3.10/site-packages/xlrd/book.py", line 1472, in unpack_SST_table assert _unused_i == nstrings - 1 AssertionError
尝试注释掉book.py中unpack_SST_table()内的断言语句后,脚本无报错但无法读取工作簿内容。
解决建议
直接用openpyxl处理.xlsx源文件
xlrd从2.0版本起不再支持.xlsx格式,既然你的源文件是.xlsx,没必要转格式,直接用openpyxl读写更稳定,示例代码:from openpyxl import load_workbook # 加载工作簿 wb = load_workbook("your_source_file.xlsx") # 获取活跃工作表 sheet = wb.active # 遍历读取内容 for row in sheet.iter_rows(values_only=True): print(row)规范格式转换流程
如果必须使用.xls格式,不要用第三方工具转格式,用Excel原生的「另存为」功能,选择「Excel 97-2003工作簿(.xls)」保存,第三方转换工具生成的.xls文件常存在格式不兼容问题,导致xlrd解析失败。修改xlrd源码(不推荐)
若坚持要用xlrd处理转换后的文件,除了注释断言,还需调整unpack_SST_table函数中的计数逻辑:将assert _unused_i == nstrings - 1改为assert _unused_i <= nstrings - 1,但这种方法可能引发其他未知问题,仅适合临时测试,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者Trouble Bucket
相关产品推荐
相关产品推荐

