Python:读取.doc、.docx 两种 Word 文件简述及“Word 未能引发事件”错误

Python 中可以读取 word 文件的库有 python-docx 和 pywin32。

pywin32

这个库很强大,不仅仅可以读取 word,但是网上介绍用 pywin32 读取 .doc 的文章真不多,因为,真心不好用。

以下是 pywin32 读取 .doc 的代码示例,但是读取表格有问题,输出全是空,原因不明,因为不打算用所以没有深入研究。另外,如果表格中有纵向合并单元格,会报错:“无法访问此集合中单独的行,因为表格有纵向合并的单元格。”

但是 pywin32 有另外一个功能,就是将 .doc 格式另存为 .docx 格式,这样我们就可以使用 python-docx 来处理了。

python-docx

对于纵向合并单元格,python-docx 的处理也很贴心。

Word 未能引发事件

我的爬虫在爬取到 .doc 文件之后,就通过上面的方法将其转为 .docx 格式,原本一切都好,下班挂机在跑,第二天来一看,报了这个错:pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Word', 'Word 未能引发事件。', 'D:\工具\Microsoft Office\Office12\2052\WDMAIN11.CHM', 25482, -2146822286), None)

我用报错的文件单独调试了 方法,并没有报错。网上查了这个错误,没有啥收获。

反复测试后发现总是那个网页报错,说明 bug 可以重现,问题是到底是哪里报错。

我将代码一行行删去,直到只留下执行到报错所必须的代码:

反复读这段代码,并没有发现什么问题。

因为有些网页的附件名称是相同的,例如 公告.doc,所以我按每个网页的标题(在总览页面爬到的)分文件夹放置下载的文件,所以方法中传了一个 参数,而如果 参数传空,则不会报错。

其实由此已经可以发现 bug 所在了,但我却没想到,又反复折腾了很久才发现,原来是文件名太长了。

在 windows 下面,单个文件名的长度限制是25,完整的路径长度(如 E:\abc\test.doc 这样限制是260)

路径最后有一个字符串结束符 '\0' 要占掉一个字符,所以完整路径实际限长是259。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181214G0B0W500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券