pythonword.documents.open报错_Python:读取两种Word⽂
件。。。
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()
return newpath
python-docx
import docx
fn = r'E:\abc\test.docx'
doc = docx.Document(fn)
for paragraph in doc.paragraphs:
)
for table in doc.tables:
for row ws:
for cell lls:
)
对于纵向合并单元格,python-docx 的处理也很贴⼼。
Word 未能引发事件
我的爬⾍在爬取到 .doc ⽂件之后,就通过上⾯的⽅法将其转为 .docx 格式,原本⼀切都好,下班挂机在跑,第⼆天来⼀看,报了这个错:我⽤报错的⽂件单独调试了 doc2docx ⽅法,并没有报错。⽹上查了这个错误,没有啥收获。
反复测试后发现总是那个⽹页报错,说明 bug 可以重现,问题是到底是哪⾥报错。
我将代码⼀⾏⾏删去,直到只留下执⾏到报错所必须的代码:
def get_winningbid_detail(url, name):
r = (url)
html = r.text
soup = BeautifulSoup(html, 'lxml')
ps = soup.find_all(text=repile('附件'))
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, )
# print(localfilename)
python怎么读文件夹下的文件夹with open(localfilename, 'wb+') as sw:
sw.(link).content)
dswith('.doc'):
doc2docx(localfilename)
反复读这段代码,并没有发现什么问题。
因为有些⽹页的附件名称是相同的,例如 公告.doc,所以我按每个⽹页的标题(在总览页⾯爬到的)分⽂件夹放置下载的⽂件,所以⽅法中传了⼀个 name 参数,⽽如果 name 参数传空,则不会报错。
其实由此已经可以发现 bug 所在了,但我却没想到,⼜反复折腾了很久才发现,原来是⽂件名太长了。
在windows下⾯,单个⽂件名的长度限制是255,完整的路径长度(如 E:\abc\test.doc)这样限制是260,⼀个汉字占2个字符。
路径最后有⼀个字符串结束符 '\0' 要占掉⼀个字符,所以完整路径实际限长是259。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论