python读取word文件
python操作word:
python操作word最常用的库是python-docx库。根据官网的方法,如果我们要获取word中的文本,可以使用如下代码获取到:
from docx import Document
doc = Document(file_path)
big_str = ""
for one_pare in doc.paragraphs:
big_str = big_str + one_pare.text
上面的big_str获取到的就是word中所有的文本字段。
如果想要获取word文件中的所有表格,则可以使用下面代码获取所有表格:
from docx import Document
doc = Document(file_path)
for one_table in doc.tables:
for one_row in one_table.rows:
for cell in one_row.cells:
print(cell.text)
上面的所有代码就能把表格中所有单元格的值打印出来
痛点
以上只是得到了word文档中所有的文本和所有的表格,如果我们想要依次获取所有的表格和文本内容,并且保证顺序不会变乱怎么办呢?查询了一遍python-docx的官网,发现并没有找到相应的答案。后来还是从其他博客中找到灵感,写了一段demo,发现确实可以。代码如下:
import os
import pandas as pd
from docx import Document
from docx.oxml import CT_P, CT_Tbl
from docx.table import Table
from docx.text.paragraph import Paragraph
doc = Document(file_path)
# 获取父节点的所有子节点
doc_element_body = doc.element.body
children = doc_element_body.iterchildren()
# 遍历子节点,并判断子节点是段落还是表格
for one_child in children:
if isinstance(one_child, CT_P):
# 如果是文本,则进行文本操作
pgh = Paragraph(one_child, self.doc)
text = pgh.text
elif isinstance(one_child, CT_Tbl):
# 如果是表格,则进行表格操作
table = Table(one_child, self.doc)
这样就得到了正确顺序的所有文本和表格内容
doc转docx
python-docx这个库有个问题就是只能操作docx文件,对doc文件却无能为力。为了解决这个问题,需要把doc文件转化为docx文件。这时就用到了pywin32库,但pywin32只能被用在windows系统中,在linux系统中是不能安装pywin32的。此时我们就需要安装linux版的办公软件libreoffice。然后用soffice命令把doc转化为docx。这个命令可以通过python的os库的os.system()方法运行完成,十分方便。