「第二章」python-docx 中的 Paragraph 教程(一)

前言(对paragraph进行说明)


      上一章我们讲了一下 python-docx 是啥,哪儿来的,还有怎么引用它。总体来说,就是扯了各种犊子,还有一点点新手小白可能不太知道的一些东西。这一章,我们开始说一些干货,当然是小白也能理解的、大神选手看一眼就懂的干货。本章,我们将围绕着 python-docx 中的 Paragraph 展开非常、及其、特别简单易懂且详细的一大波讲解。看完本章后,无论小白还是大白还是老白,一定都能把这一部分的内容玩儿的很明白。

        本章所讲解的内容主要为 python-docx 中的 Paragraph 的各种操作手法,那我一直默默唧唧说的这个 Paragraph 到底是个啥子东西呢?我们先来了解一下在 python-docx 眼中,docx 的长相是什么样子的,来一张图辅助理解一下。

「第二章」python-docx 中的 Paragraph 教程(一)_第1张图片

        如上图所示,在 docx 中,每一个段落,就是 python-docx 眼中的一个 paragraph,毕竟这个单词本身也是段落的意思。每一个 Paragraph 又由若干个 run 组成,一般情况下,在同一个 Paragraph 中,如果包含不同字体的个别词或句子,就会被定义为一个 run。在python-docx眼中,下图是一个paragraph,但由于字体格式的不同,这个paragraph又被分为了三个run。

「第二章」python-docx 中的 Paragraph 教程(一)_第2张图片

注:虽然不同的字体会将一个段落分为若干的run,但是我们在实际对docx文档的操作过程中会发现,即使字体完全相同,一个paragraph可能也会被分成毫无规则的若干个run。

Paragraph 的实际操作(一)

为了少说废话,多多带大家认识、熟悉和掌握python-docx中的各种功能函数,在接下来的篇幅中,我们会从实例处理出发,解释python-docx中的每一个功能函数。


目标一、使用python-docx读取(遍历)所有 Paragraph。

A、过程描述:

① 随便创建一个docx文档,在其中写入几段内容,在本次的样例中,我所使用的文档为:朱自清《背影》。

「第二章」python-docx 中的 Paragraph 教程(一)_第3张图片

② 打开Spyder,创建python工程,并引入python-docx库。

③ 利用python-docx提供的函数对文档进行处理。

注:

(1)关于我为什么使用Spyder,这里面为什么不是pyCharm、VSCode等其它编程环境,在第一章中已经说明了,其实不管白猫还是黑猫,只要能抓住耗子,就是好猫,大家各自【投己所好】。

(2)如何安装python-docx依赖库、如何在工程中引入python-docx库,在第一章中已经进行了详细的讲解,这里就不再赘述了。

B、代码实现:

第一步、使用第一章中讲解引入python-docx的方法,在我们的工程中引入python-docx依赖库。

# 在本例中,我使用 import 直接将 docx 作为相对路径引入本工程。

# 当然你也可以使用 from docx import document,或 from docx import * 进行引用。

import docx

第二步、使用python-docx依赖库提供的命令打开我们想要操作的文档。

import docx

# 使用 import 引入 python-docx 依赖库后,使用 docx.Document() 语句打开我们的目标文档,

# 并把打开的文档存储于变量 docTemp 中。

docTemp = docx.Document('E:\\UserData\\Desktop\\背影.docx')

读入文档后,如果我们对 docTemp 进行输出,会得到如下的结果:

# 使用 print() 语句对变量 docTemp 进行输出。

print(docTemp)
# 使用 print() 语句输出 docTemp 得到如下结果

第三步、构建 for 循环,对文档中的 paragraph 进行遍历输出。

# 以下代码的含义为:

# docTemp.paragraphs 代表文档中所有段落的集合,

# 从 docTemp 这篇 docx 文档的第一段开始,一直到最后一段,依次输出每一段,

# 此时,我们输出的为文档中的每一个 paragraph 对象,即每一段,但并非每一段的文本。

for paragraph in docTemp.paragraphs:
    print(paragraph)
# 上述代码输出内容如下:








如上面代码中注释部分所说,上面这一段代码输出的为文档中的每一个 paragraph 对象,从上到下分别问文档中的第一段至第八段,但并非我们想要的段落文本,我们最终想输出的内容为被操作的文档的每一段的文本,这个时候,我们需要使用 paragraph 的参数:text,书写方式为:paragraph.text,代码如下:

# 以下代码的含义为:

# docTemp.paragraphs 代表文档中所有段落的集合,

# 从文档的第一段开始,一直读取到最后一段,

# 并输出每一段的 text,即为我们想要的每一段的文本。

for paragraph in docTemp.paragraphs:
    print(paragraph.text)

综上所述,目标一:使用python-docx读取所有段落(Paragraph)的完整代码如下:

import docx

docTemp = docx.Document('E:\\UserData\\Desktop\\背影.docx')

print(docTemp)

for paragraph in docTemp.paragraphs:
    print(paragraph.text)

注:

(1)通过上面的描述我们可以知道,一个文档的所有段落集合为:docTemp.paragraphs,它其实是一个数组,计数从0开始,文档如果一共有八段,则计数则为 0-7,所以如果我们想要输出文档对象的特定段落,可以通过以下方式进行输出:

# 输出文档中的第一段的文本
print(docTemp.paragraphs[0].text)

# 输出文档中的第二段的文本
print(docTemp.paragraphs[1].text)

# 输出文档中的第八段的文本
print(docTemp.paragraphs[7].text)

(2)一篇文档的段落数未知的情况下,如果我们想要操作第一段,那肯定就会通过 docTemp.paragraphs [ 0 ] 的方式去操作,那如果我们想直接操作最后一段,而文档的段落总数有可能会发生变的话,我们可以通过如下方式进行:

# 一篇文档不管多长,不管他段落是增加,还是减少,最后一段的位置永远不会变。

# 以下代码的意思就是:

# 使用 len(docTemp.paragraphs) 取出所有段落数,

# 用取出来的所有段落数 减去 1,即为最后一段所在位置。

docTemp.paragraphs[len(docTemp.paragraphs)-1].text

所以,最后一段就是:段落总数 减去 1,倒数第二段就是:段落总数 减去 2,知道了这些,我们就可以在使用 pthon-docx 更加灵活的操作文档。

第一节先写到这里了。

第二章的后续会为大家继续更新 paragraph 中 run 的遍历,以及 paragraph 的增、删、改、查以及字体、段落格式的修改等内容。

你可能感兴趣的:(Python-docx,python)