You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:40:20