用python解析word文件(2)--Document对象
自然之子进化之奴
2022年11月25日 15:00
收录于文集
共5篇

python-docx库

安装

官方文档:https://python-docx.readthedocs.io/en/latest/index.html

中文翻译文档https://www.zybuluo.com/belia/note/1303813

可以用dir或help来查看具体的方法使用。

 

它也只能解析docx文件,解析不了doc文件。在加载doc文件时,会出现问题,建议先将doc文件批量转换为docx文件,例如利用工具doc2doc:http://www.batchwork.com/en/doc2doc/。

 

安装方式直接pip,pip工具在python安装路径下的Scripts文件夹中

pip install python-docx

pip3 install python-docx -i https://pypi.douban.com/simple          # 豆瓣镜像下载

当然你也可以选择使用easy_install或者手动方式进行安装,不过不建议下载安装。

 

在导入模块时,用的是

import docx

文档层次

Word文档比较复杂,是二进制文件,所以常规的读取文件方法是没用的,所以docx包用不同的文本类型来表示:

l  Document对象,最顶层,其代表整个文档

l  block-level(块等级) paragraph(段落)是常见的块等级,换行符结尾算一个段落 table(表格)、图片(inline picture)、标题(heading)有序列表(numbered lists)、无序列表(bullets lists)均属于块对象 对于块对象属性,常见有对齐(alignment)、缩进(indent)以及行间距(space)等等

l  inline-level(内联等级),其属于块等级中, run是常见的内联等级,一个块对象可由多个run组成,特别是通过run可由设置不同属性样式; 文字、句子、段落均可作为内联对象; 对于内联对象属性,常见有字体、大小、对齐以及颜色等等

 

文档对象的关系

l  Document对象的paragraphs 属性,是Paragraph对象的列表。

l  Paragraph 对象表示word文档中的一个段落。Paragraph对象,有一个 text 属性,包含该段中文本的字符串(没有样式信息)。 Paragraph 对象有一个 runs 属性,它是 Run 对象的列表。具有相同格式的文字组成一个run。如下图中的单句段落有 4 个 Run 对象。

l  Run 对象:也有一个 text 属性,包含那个延续中的文本。一个 Run 对象是相同样式文本的延续。当文本样式发生改变时,就需要一个新的 Run 对象。

 

Document对象

新建

document = Document()  #创建基于默认“模板”的空白文档

设置默认格式

document.styles[‘Normal’].font.name = u’字体名’

document.styles[‘Normal’]._element.rpr.rFonts.set(qn(“w:eastAsia”), u”字体名”)

打开

doc = docx.Document('demo.docx&#​39;)     # 打开当前目录下的文档

doc = docx.Document('../dir/demo.docx&#​39;)     # 打开指定目录下的文档

Document对象的属性和方法

属性    说明

Paragraphs属性    返回段落的列表

tables    返回表格的列表

sections    返回节的列表

styles    返回样式的列表

inline_shapes    返回图像的列表

 

方法    说明

add_heading() 方法:    插入标题。其中参数level是标题等级,0表示一级标题,1表示二级标题,以此类推。

add_paragraph()方法:    在尾部插入段落,参数style是样式,默认不应用样式。将一段新文本添加到文档中,并返回添加的 Paragraph 对象的引用。第二个参数表示   Paragraph对象样式的字符串。例如:doc.add_paragraph('Hello world!&#​39;,   'Title&#​39;)    添加了一段,文本是 Hello world!,样式是 Title。

insert_paragraph_before()方法:    在某段落前插入一个段落。prior_paragraph =   paragraph.insert_paragraph_before('这是前面的段落。&#​39;)

add_picture()方法:    用来插入图片。Doc.add_picture(‘文件名’, width=Cm(5), height=Cm(5)

add_table()方法:    插入表格等。

add_page_break():    添加一个分页

save('文件名&#​39;)方法:    保存文档-覆盖原文档

读取实例

从 http://nostarch.com/automatestuff/下载demo.docx,并将它保存在当前工作目录中。然后在交互式环境中输入以下代码:

>>> import docx

>>> doc = docx.Document('demo.docx&#​39;)

>>> len(doc.paragraphs)

7                                                                                               #该文档有 7 个 Paragraph 对象

>>> doc.paragraphs[0].text

'Document Title&#​39;                                                                   #该段中文本的字符串(没有样式信息)

>>> doc.paragraphs[1].text

'A plain paragraph with some bold and some italic'

>>> len(doc.paragraphs[1].runs)

4                                                                                               # 段落有4 个Run 对象

>>> doc.paragraphs[1].runs[0].text

'A plain paragraph with some &#​39;

>>> doc.paragraphs[1].runs[1].text

'bold&#​39;

>>> doc.paragraphs[1].runs[2].text

' and some &#​39;

>>> doc.paragraphs[1].runs[3].text

'italic&#​39;

 

例子2:从.docx 文件中取得完整的文本。只关心 Word 文档中的文本,不关心样式信息。

#! python3

import docx

def getText(filename):

    doc = docx.Document(filename)

    fullText = []

    for para in doc.paragraphs:

        fullText.append(para.text)

    return '\n&#​39;.join(fullText)

 

例子:读取word中的文本

def gettxt():

    file=docx.Document("gao.docx&#​34;)

    print("段落数:&#​34;+str(len(file.paragraphs)))  # “段落数为13“

    #输出段落编号及段落内容

    for i in range(len(file.paragraphs)):

        if len(file.paragraphs[i].text.replace(‘ ‘,‘‘))>4:

            print("第&#​34;+str(i)+"段的内容是:&#​34;+file.paragraphs[i].text)

 

写入实例

添加段落

在交互式环境中输入以下代码:

>>> import docx

>>> doc = docx.Document()

>>> doc.add_paragraph('Hello world!&#​39;)

<docx.text.Paragraph object at 0x0000000003B56F60>

>>> doc.save('helloworld.docx&#​39;)

 

添加文本

调用 Paragraph 对象的 add_run()方法,向它传入一个字符串。

在交互式环境中输入以下代码:

>>> import docx

>>> doc = docx.Document()

>>> doc.add_paragraph('Hello world!&#​39;)

<docx.text.Paragraph object at 0x000000000366AD30>

>>> paraObj1 = doc.add_paragraph('This is a second paragraph.&#​39;)

>>> paraObj2 = doc.add_paragraph('This is a yet another paragraph.')

>>> paraObj1.add_run(' This text is being added to the second paragraph.')

<docx.text.Run object at 0x0000000003A2C860>

>>> doc.save('multipleParagraphs.docx&#​39;)

得到的文本如图13-9 所示。请注意,文本This text is being added to the second paragraph.被添加到 paraObj1 中的 Paragraph 对象中,它是添加到 doc 中的第二段。

要记住,对于 python-docx 的 0.5.3 版本,新的 Paragraph 对象只能添加在文档的末尾,新的 Run 对象只能添加在 Paragraph 对象的末尾。