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

优点缺点python-docx跨平台只能处理 .docx 格式,不能处理.doc格式pywin32仅限 windows 平台.doc 和 .docx 都能处理

本人对于Python学习创建了一个小小的学习圈子,为各位提供了一个平台,大家一起来讨论学习Python。欢迎各位到来Python学习群:960410445一起讨论视频分享学习。Python是未来的发展方向,正在挑战我们的分析能力及对世界的认知方式,因此,我们与时俱进,迎接变化,并不断的成长,掌握Python核心技术,才是掌握真正的价值所在。

pywin32

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

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

from win32com.client import Dispatch

word = Dispatch('Word.Application') # 打开word应用程序

# word = DispatchEx('Word.Application') # 启动独立的进程

word.Visible = 0 # 后台运行,不显示

word.DisplayAlerts = 0 # 不警告

path = r'E:\abc\test.doc'

doc = word.Documents.Open(FileName=path, Encoding='gbk')

for para in doc.paragraphs:

print(para.Range.Text)

for t in doc.Tables:

for row in t.Rows:

for cell in row.Cells:

print(cell.Range.Text)

doc.Close()

word.Quit

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

def doc2docx(path):

w = win32com.client.Dispatch('Word.Application')

w.Visible = 0

w.DisplayAlerts = 0

doc = w.Documents.Open(path)

newpath = os.path.splitext(path)[0] + '.docx'

doc.SaveAs(newpath, 12, False, "", True, "", False, False, False, False)

doc.Close()

w.Quit()

os.remove(path)

return newpath

python-docx

import docx

fn = r'E:\abc\test.docx'

doc = docx.Document(fn)

for paragraph in doc.paragraphs:

print(paragraph.text)

for table in doc.tables:

for row in table.rows:

for cell in row.cells:

print(cell.text)

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

Word 未能引发事件

我的爬虫在爬取到 .doc 文件之后,就通过上面的方法将其转为 .docx 格式,原本一切都好,下班挂机在跑,第二天来一看,报了这个错:

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

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

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

def get_winningbid_detail(url, name):

r = requests.get(url)

r.encoding = 'utf-8'

html = r.text

soup = BeautifulSoup(html, 'lxml')

ps = soup.find_all(text=re.compile('附件'))

if len(ps) > 0:

os.makedirs(os.path.join(download_dir, name), exist_ok=True)

for p in ps:

a_tab = p.find_next_sibling('a')

if a_tab is not None:

link = homepage + a_tab['href']

localfilename = os.path.join(download_dir, name, a_tab.text)

# print(localfilename)

with open(localfilename, 'wb+') as sw:

sw.write(requests.get(link).content)

if localfilename.endswith('.doc'):

doc2docx(localfilename)

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

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

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

在windows下面,单个文件名的长度限制是255,完整的路径长度(如 E:\abc\test.doc)这样限制是260,一个汉字占2个字符。

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

python word.documents.open报错_Python:读取两种Word文件简述及文件未能引发事件错误...相关推荐

  1. python word.documents.open报错_Python教程:[43]Word基本操作

    使用python操作Word用到了win32com模块,我们现在就要介绍一下python对Word的基本操作,文章涉及到如何与Word程序建立连接.如果与Word文档建立连接的,以及对Word文档的基 ...

  2. python查询mysql decimal报错_python读取MySQL数据表时,使用ast模块转换decimal格式数据的坑...

    概述 MySQL中常用的数据格式有tinyint().int().float().double().decimal() .varchar.enum().datetime;小数格式中decimal比较常 ...

  3. VUE router 导航重复点击报错的问题解决两种方案

    VUE router 导航重复点击报错的问题解决两种方案 前几天一个月薪35k的兄弟,给我推了一个人工智能学习网站,看了一段时间挺有意思的.包括语音识别.机器翻译等从基础到实战都有,很详细,分享给大家 ...

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

    Python 中可以读取 word 文件的库有 python-docx 和 pywin32. 优点 缺点 python-docx 跨平台 只能处理 .docx 格式,不能处理.doc格式 pywin3 ...

  5. Python:读取两种Word文件简述及文件未能引发事件错误

    Python 中可以读取 word 文件的库有 python-docx 和 pywin32. 优点缺点python-docx跨平台只能处理 .docx 格式,不能处理.doc格式pywin32仅限 w ...

  6. python 读取 docx 报错_python读取docx文件,就是如此简单

    中文编码问题总是让人头疼(尤其是mac本),想要用Python读取word中的内容.用open()经常报错,通过百度搜索+问身边小伙伴发现了Python有专门读取.docx的模块python_docx ...

  7. python import xlrd 报错_python读取excel(xlrd)

    一.安装xlrd模块: 1.mac下打开终端输入命令: pip install xlrd 2.验证安装是否成功: 在mac终端输入 python  进入python环境 然后输入 import xlr ...

  8. python爬虫资源路径报错_python爬虫

    一.网络爬虫介绍 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成. 例如,百度.google搜索某关键字时,就是爬取整个互联网上的相关资源,给呈现出来. 实际爬 ...

  9. python -m uiautomator2 init 报错_Python|实现属于自己的数据类型

    我们今天聊聊怎么使用python中的特殊方法来实现属于自己的数据类型. python中有很多的数据类型,比如说数组.字典等等. 我们先来看一个例子,我们平时使用 len() 这个函数的次数很多,它会获 ...

最新文章

  1. 无法启动程序,拒绝访问解决方法
  2. 汇编----连接,编译
  3. 正则表达式,解决要么有要有没有,但必须开头
  4. 项目中用到的BAPI合集
  5. 【客户下单】基于CRM完全匹配地址库实现自动分单
  6. open pwrite
  7. 【chromium】 Chromium OS的oom机制
  8. java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)...
  9. 大数据技术周报第 004 期
  10. Sublime Text 2报 Decode error - output not utf-8 错误的解决办法
  11. 【Python】变量那些事
  12. html js url 跳转页面内容,js跳转页面方法总结
  13. 您使用的是不受支持的命令行标记: --unsafely-treat-insecure-origin-as-se
  14. 11.29晚 心情 晴 既然选择了Linux这条路就要坚持走下去
  15. 异步 Action 的定义
  16. 超能竞速大开眼界,iQOO 5系列正式发布
  17. vs code 格式化代码配置
  18. 累计分布函数与互补累计分布函数
  19. icp光谱仪的工作原理_ICP的工作原理
  20. Php使用ZipArchive打包下载文件、图片

热门文章

  1. 华为畅享7鸿蒙,触手可及的千元手机精品:华为畅享7体验评测
  2. c#语言swith的用法,C# switch 语句 | Microsoft Docs
  3. js利用本地储存开获取商品足迹
  4. Python后端开发需要哪些知识
  5. utgard连接opcserver报错Caused by: org.jinterop.dcom.common.JIRuntimeException: Access is denied. [0x800
  6. ios 代码设置控件宽高比_IOS开发入门之iOS一套代码适配所有iPhone手机布局实现方案...
  7. 〖Python WEB 自动化测试实战篇⑭〗- 实战 - 生成可视化测试报告
  8. 计算机毕业设计Java办公自动化管理系统(源码+系统+mysql数据库+lw文档)
  9. java线上常见问题_java线上问题排查总结
  10. 惠普202打印机连打每张间隔时间长