上一章我们讲了一下 python-docx 是啥,哪儿来的,还有怎么引用它。总体来说,就是扯了各种犊子,还有一点点新手小白可能不太知道的一些东西。这一章,我们开始说一些干货,当然是小白也能理解的、大神选手看一眼就懂的干货。本章,我们将围绕着 python-docx 中的 Paragraph 展开非常、及其、特别简单易懂且详细的一大波讲解。看完本章后,无论小白还是大白还是老白,一定都能把这一部分的内容玩儿的很明白。
本章所讲解的内容主要为 python-docx 中的 Paragraph 的各种操作手法,那我一直默默唧唧说的这个 Paragraph 到底是个啥子东西呢?我们先来了解一下在 python-docx 眼中,docx 的长相是什么样子的,来一张图辅助理解一下。
如上图所示,在 docx 中,每一个段落,就是 python-docx 眼中的一个 paragraph,毕竟这个单词本身也是段落的意思。每一个 Paragraph 又由若干个 run 组成,一般情况下,在同一个 Paragraph 中,如果包含不同字体的个别词或句子,就会被定义为一个 run。在python-docx眼中,下图是一个paragraph,但由于字体格式的不同,这个paragraph又被分为了三个run。
注:虽然不同的字体会将一个段落分为若干的run,但是我们在实际对docx文档的操作过程中会发现,即使字体完全相同,一个paragraph可能也会被分成毫无规则的若干个run。
为了少说废话,多多带大家认识、熟悉和掌握python-docx中的各种功能函数,在接下来的篇幅中,我们会从实例处理出发,解释python-docx中的每一个功能函数。
A、过程描述:
① 随便创建一个docx文档,在其中写入几段内容,在本次的样例中,我所使用的文档为:朱自清《背影》。
② 打开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 的增、删、改、查以及字体、段落格式的修改等内容。