仅此记录python读取doc/docx文件的方法,和常用简单的open txt文件完全不同(版本python 3.6 Win10)
docx
使用docx包,python为其专用接口,python-docx,使用
pip install python-docx
安装即可,本人第一次在pycharm直接安装,出现了关于版本报错的问题,后来直接使用pip安装成功,简单使用如下:
import docx
path = "append/***.docx"
file = docx.Document(path)
for p in file.paragraphs:
print(p.text)
同时,对于文档,要通过每一段来获取内容,不能直接输出file得到文本内容
docx中包含超链接网址的读取
分段读取
这次使用时,发现正常读取无法读取docx中网址,例如下面word文档(.docx)中的网址:
csdn:https://blog.csdn.net/weixin_39643135/article/details/91348983
腾讯网:https://www.qq.com/
百度:https://www.baidu.com/
将该docx复制一份,并重命名为.zip,然后解压缩,得到:
打开word文件夹,查看document.xml,大致看一下结构:
就可以大致了解后面获取超链接的原理了。
import docx
def get_paragraph_from_docx(paragraph):
"""
处理docx文件无法直接获取网址链接文本问题
:param paragraph: 读取到的该段落,会自动跳过表格
:return: 文本text,有无链接均可处理
"""
t_para = u""
# 有无超链接均可处理
xml_str = str(paragraph.paragraph_format.element.xml)
wt_list = re.findall('<w:t[\S\s]*?</w:t>', xml_str)
for wt in wt_list:
wt_content = re.sub('<[\S\s]*?>', u"", wt)
t_para += wt_content
'''
多个链接会需要该部分,将各部分连接,最后返回的就是text了,为一个list
text = []
if t_para:
t_para = t_para.strip()
t_para = re.sub('[\s]', '', t_para)
if t_para:
text.append(t_para)
'''
return t_para
path = "append/***.docx"
file = docx.Document(path)
for p in file.paragraphs:
text = get_paragraph_from_docx(p)
注:上面部分无法获取表格、word自动生成的编号等,类似的,这些还需要同其他正则表达式匹配
不分段-直接读取全部
上面是用了之前的方式,分段读取超链接,还可以直接读取该篇文章的所有链接:
from docx import Document
from docx import RT
document = Document(".docx")
rels = document.part.rels
for rel in rels:
if rels[rel].reltype == RT.HYPERLINK:
print("\n 超链接文本为", rels[rel], " 超链接网址为: ", rels[rel]._target)
doc
查看了网上的各种方法,大部分还是接受将doc文件强制另存为docx文件(使用代码转换,而不是直接修改后缀),在读取即可,需要另外安装win32com模块,注意就是直接使用 pip install win32com 安装不成功,需要用
python -m pip install pypiwin32
即可,简单使用如下
import docx
import win32com.client as wc
#doc文件另存为docx
word = wc.Dispatch("Word.Application")
doc = word.Documents.Open(r"F:\\***\\***\\append\\***.doc")
#上面的地方只能使用完整绝对地址,相对地址找不到文件,且,只能用“\\”,不能用“/”,哪怕加了 r 也不行,涉及到将反斜杠看成转义字符。
doc.SaveAs(r"F:\\***\\***\\appendDoc\\***.docx", 12, False, "", True, "", False, False, False, False)#转换后的文件,12代表转换后为docx文件
#doc.SaveAs(r"F:\\***\\***\\appendDoc\\***.docx", 12)#或直接简写
#注意SaveAs会打开保存后的文件,有时可能看不到,但后台一定是打开的
doc.Close
word.Quit
path = "appendDoc/***.docx"
file = docx.Document(path)
for p in file.paragraphs:
print(p.text)
在想办法如何可以在保存的时候不打开docx文件,查看了SaveAs的参数,但还没有发现结果。。。希望各位大佬哪位知道可以解惑
没有具体实现了解,只当看了下,需要安装库 pdfminer 使用