xlrd》操作excel  出现的问题

报错如下:

D:\python37\python.exe D:/testWang/waimai/tools/get_excelData.py
*** formula/tFunc unknown FuncID:186
*** formula/tFunc unknown FuncID:186
*** formula/tFunc unknown FuncID:186
*** formula/tFunc unknown FuncID:186
*** formula/tFunc unknown FuncID:186
*** formula/tFunc unknown FuncID:186
Traceback (most recent call last):
File "D:/testWang/waimai/tools/get_excelData.py", line 42, in <module>
print(get_excelData('登录模块', 2, 7))
File "D:/testWang/waimai/tools/get_excelData.py", line 18, in get_excelData
workBook = xlrd.open_workbook(excelDir, formatting_info=True)
File "D:\python37\lib\site-packages\xlrd\__init__.py", line 157, in open_workbook
ragged_rows=ragged_rows,
File "D:\python37\lib\site-packages\xlrd\book.py", line 117, in open_workbook_xls
bk.parse_globals()
File "D:\python37\lib\site-packages\xlrd\book.py", line 1245, in parse_globals
self.names_epilogue()
File "D:\python37\lib\site-packages\xlrd\book.py", line 1043, in names_epilogue
evaluate_name_formula(self, nobj, namex, blah=blah)
File "D:\python37\lib\site-packages\xlrd\formula.py", line 1150, in evaluate_name_formula
assert len(tgtobj.stack) == 1
AssertionError

Process finished with exit code 1


问题现象:

python脚本在调用xlrd模块解析excel文件时,提示如下错误:

  1. *** formula/tFunc unknown FuncID:186

进而导致整个脚本崩溃。

原因分析:

xlrd模块在解析excel文件时会尝试解析excel中的函数,这些函数被定义在一个字典

而当前xlrd对excel函数的支持并不全,比如index:186的就不支持;

遇到这种不支持的函数,xlrd会assert异常,终止解析;

其实这种做法无可厚非,遇到未知的情况,在不能保证正确的情况下终止解析,看起来是最好的;

但是,在有些情况下,我们还是希望能够选择忽略掉这个错误接着解析的,但是xlrd没有给我们这个选择。

解决方案:

思路:忽略异常,继续解析文件;

思路一: 让assert无效。

我知道c++在release版中assert都是无效的,但是python中貌似做不到。

我尝试过把脚本编译成pyc后执行,但仍会assert的。

思路二: 修改xlrd

既然问题出在xlrd上,那么最直接的办法就是修改xlrd;这里有两种方案:

一、     方案一:

参考网上的方法,对未知的excel函数,假装知道——在xlrd的字典中,添加FuncID:186,让xlrd认为支持这个函数,不再报错:

/usr/local/lib/python3.4/site-packages/xlrd-1.0.0-py3.4.egg/xlrd/formula.py:240

  1.  
    184: ('FACT', 1, 1, 0x02, 1, 'V', 'V'),
  2.  
    + 186: ('HACKED', 1, 1, 0x02, 1, 'V', 'V'),
  3.  
    189: ('DPRODUCT', 3, 3, 0x02, 3, 'V', 'RRR'),

二、     方案二:

与方案一思路一致,删除assert,让程序继续进行下去;

/usr/local/lib/python3.4/site-packages/xlrd-1.0.0-py3.4.egg/xlrd/formula.py:1307

  1.  
    else:
  2.  
    # assert len(tgtobj.stack) == 1
  3.  
    res = copy.deepcopy(tgtobj.stack[0])

优劣:

方案一:修改后影响未知,xlrd最终会怎么处理186这个id我并不清楚;

方案二:相对安全,但我们丧失了提前得知脚本有问题的优势;

思路三: 使用期他的excel库解析;

逃避方案: xlwingsble/, openpyxl/en/latest/, pandas, win32com-excel-mini-cookbook/, xlsxwriter/, DataNitro

结论

综合考虑,目前我采用的是第二个思路的方案二。

参考资料:

https://stackoverflow.com/questions/29971186/python-xlrd-error-formula-tfunc-unknown-funcid186

https://github.com/python-excel/xlrd/issues/154

xlrd》操作excel 出现的问题:File "D:\python37\lib\site-packages\xlrd\formula.py", line 1150, in evaluate_name_formula assert len(tgtobj.stack) == 1的更多相关文章

  1. win10中通过Anaconda安装tensorflow时报错Traceback (most recent call last): File “E:\Anaconda3\lib\site-packages\pip_vendor\urllib3\response.py”, line 360, in _error_catcher yield

    问题:通过默认镜像安装,下载过程中可能会报错,下载安装失败 Traceback (most recent call last): File “E:\Anaconda3\lib\site-package ...

  2. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-xlrd操作excel(11)

    xlrd操作excel # -*- coding: utf-8 -*- # @Time : 2020/2/12 9:14 # @File : do_excel_xlrd_11.py # @Author ...

  3. python使用xlrd 操作Excel读写

    此文章非本人 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境. 二.使用介绍 1.导入模块 i ...

  4. python使用xlrd操作Excel文件

    一.xlrd读取Excel文件 用xlrd进行读取比较方便,流程和平常手动操作Excel一样,打开工作簿(Workbook),选择工作表(sheets),然后操作单元格(cell). 例子:要打开当前 ...

  5. python办公入门4:xlrd操作excel行

    操作excel行 1 #通过索引获取操作行 2 sheet=data.sheet_by_index(0) 3 #获取当前sheet下的有效行数 4 print(sheet.nrows) 5 #获取某一 ...

  6. python-通过openpy操作excel

    1.安装 openpyxl pip install openpyxl == 2.3.5  安装指定版本 遇到问题: 查询结果:这是因为电脑上有其他软件也有pip命令,我的电脑上是因为装了loadrun ...

  7. Python操作excel(xlrd和xlwt)

    Python操作excel表格有很多支持的库,例如:xlrd.xlwt.openpyxl.win32com,下面介绍使用xlrd.xlwt和xlutils模块这三个库不需要其他的支持,在任何操作系统上 ...

  8. python学习笔记(十八)python操作excel

    python操作excel需要安装通过pip安装xlwt, xlrd这两个模块: pip install xlwt pip insall xlrd 操作excel ,写入excel: import x ...

  9. python中操作excel数据

    python操作excel,python有提供库 本文介绍openpyxl,他只支持新型的excell( xlsx)格式,读取速度还可以 1.安装 pip install openpyxl 2.使用 ...

随机推荐

  1. k8s对接jenkins通用pipeline

    pipeline { agent any tools { //工具必须预先在jenkins中预配置 maven 'mvn' jdk 'jdk' } stages { stage('Env') { st ...

  2. 计算机网络再次整理————tcp[二]

    前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...

  3. Java 继承02

    向上类型转换 父类型的引用指向子类型的实例. Person p = new Person();Animal a = p; //子类对象赋值给父类类型的变量 注意: 向上转型后,子类单独定义的方法会丢失 ...

  4. 布客&#183;ApacheCN 编程/后端/大数据/人工智能学习资源 2020.9

    公告 ApacheCN 项目的最终目标:五年内备份并翻译 Github 上的所有教程(其实快被我们啃完了,剩下的不多了). 警告各位培训班:对 ApacheCN 宣传文章的举报,也将视为对 Apach ...

  5. 【第十二期】腾讯后台实习初试、复试、HR面经 (许愿OC)

    楼主投的很晚属于正常批才开始,初试面试官比较重基础,复试面试官比较看综合能力,HR小姐姐声音好听,腾讯面试官都特别nice! 一面: 看你项目很多,你挨个给我介绍一遍吧 我:一大堆按着简历介绍 日志文 ...

  6. AI算法测评(二)--算法测试流程

    根据算法测试过程中遇到的一些问题和管理规范, 梳理出算法测试工作需要关注的一些点: 编号 名称 描述信息 备注 1 明确算法测试需求 明确测试目的 明确测试需求, 确认测试需要的数据及场景 明确算法服 ...

  7. Android WebView组件 访问部分网页崩溃问题【已解决】

    最近刚接触Android,在测试WebView组件时发现总是出现崩溃现像: 提示:ERR_CLEARTEXT_NOT_PERMITTED 当时以为是权限问题,查找自己的AndroidManifest文 ...

  8. docker的使用 (2)

    使用Docker 想要玩转Docker,最简单的办法就是马上用Docker创建一些自己学习和工作中需要用到的容器,下面我们带着大家一起来创建这些容器. 运行Nginx Nginx是高性能的Web服务器 ...

  9. visual studio版本 宏

    转载请注明来源:https://www.cnblogs.com/hookjc/ MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) MSVC++ 11. ...

  10. 读取.properties配置文件的方式

    一.Properties类解读: 1.Properties类本质其实还是HashTabe,及底层的实现是HashTable public class Properties extends Hashta ...