第一章:python-docx 基础知识

前言(不感兴趣不用看~)


        源于一次我们单位领导的神奇需求,我认识了一个利用Python语言处理Word的神器,即为本专栏所介绍的:python-docx。

        我所在单位是一家与网络安全相关的单位,平时总会为第三方公司出具大批量的报告,客户总会冒出来很多奇奇怪怪、亟待解决、消耗很多人力、又非常简单的需求,比如他会突然给我们一个模板,让我们按照给定的模板,出1000份报告,这个模板中70%,甚至80%以上的内容,都是一样的,我们要做的就是按照模板,修改其中那20%-30%的差异部分,检查无误后(页码、错别字、叠字 and so on······),然后生成为PDF,再交给他们。

        起初一旦有了这种任务,我们十几个人简直是痛不欲生,苦不堪言,悲痛欲绝,死去活来,总之,在当时,你可以把所有能表达让人绝望和抓狂的词语全部加在我们的身上,光是任务多而简单重复也就罢了,关键全都是无需任何思考的复制粘贴,三到五天,每天8小时,做着简单而重复的工作,真的会让人抓狂,关键还会占用我们其他很重要的工作的时间,那些被占了时间的重要工作,就必须得通过回家后线上办公,周末的时间线上办公,法定假日的时间线上办公的方式去搞定了。后来······

        emmm,后来,领导应该是也做得烦了,因为,他也需要和我们做一样的工作,然后领导就问啊:

        “内个,谁谁谁啊,这个东西,能不能想办法用自动化解决一下啊”。

        我硬着头皮答应了,因为我也想啊,如果能自动化的几秒钟或几分钟,哪怕是自动5-10分钟,那也比我们十几个人好多天把时间都浪费了强百倍啊。接下这个任务后,我就用度娘 股沟了一下,发现了这个从此以后爱不释手的小东西------由Steve Canny编写的python-docx,当然在这里我不是向大家推荐,也不是说python-docx就是目前为止最为好用的docx处理工具,只是把我所认知的一些事情分享给大家,如果有什么说的不对的地方,欢迎大家批评指正哈。

python-docx到底是个啥?(墨迹给新人)


        python-docx,读到名字就知道了,是一个和python有关系的东西,那它到底是个什么东西嘞?python-docx,由Steve Canny基于openXML开发,还有众多的贡献者,就不一一列名了,和我们的文章也没有什么关系,如果在读的你感兴趣,或者也想成为贡献者,可以前往:

  • 文档站:python-docx — python-docx 0.8.11 documentationhttps://python-docx.readthedocs.io/en/latest/
  • 作者的GithubGitHub - python-openxml/python-docx: Create and modify Word documents with PythonCreate and modify Word documents with Python. Contribute to python-openxml/python-docx development by creating an account on GitHub.https://github.com/python-openxml/python-docx

看一下相关的东西,完蛋了,说跑偏了,我们转回来哈。Python-docx是利用python开发的一款python库,作者在里面已经写好了众多的docx文档处理功能,我们只需要熟悉python的基本语法,然后学习一下python-docx库的每一个函数(功能)的用法,就可以轻松自如的应对各种Docx文件了,比如以下功能(当然适用范围为:人懒、简单、内容多):

  • 根据某个需求创建指定的docx文档,并在里面生成自己想要的内容,内容可以来自于:各种搜索引擎、引用其他文档、随机生成等等。
  • 根据某个需求修改别人发来的docx文档

        我说提到的需求,只是我目前为止遇到的需求,工欲善其事必先利其器,当我们掌握了一项神奇的技能,那我们以后利用这个技能可以做的事,肯定是越来越多,比如学会了python-docx,你可以应对自己工作中那些简单而多的任务,你可以去有相关需求的人接单赚钱,你可以使用python-docx结合python爬虫技术,批量生成某些人想要的某些文档等等,在更完了本专栏的文章后,我会写出100个python-docx使用样例,这样无论大家遇到什么样花里胡哨的问题,就都能轻松解决了。

如何安装 python-docx 呢?


        python不知道大家都是用什么IDE?常见的有VScode、pycharm、Spyder等,我使用的是Spyder,同事都给我推荐pycharm,但是可能是先入为主的原因,我在尝试了pycharm后,还是选择了Spyder,这个IDE的问题,我感觉大家选择一款自己喜欢的就好。

        如果python还不会安装的话,去百度一篇如何安装python就好了,我推荐使用Anaconda(点链接去下载:Anaconda | The World’s Most Popular Data Science Platform),Anaconda这个东西,可以一键安装python的集成开发环境,比较方便一些。

        在安装好了python之后,是不能直接使用python-docx的,python安装之后,所带的库都是标准库,而python-docx属于第三方库,所以我们需要自行安装一下这个库,具体安装方法为通过下面的命令进行安装。

# 使用 pip install 命令,安装 python-docx 库

pip install python-docx

 如果一切操作都“畅通无阻”的话,应该会得到如下图所示的提示:

Successfully installed python-docx-0.8.11

第一章:python-docx 基础知识_第1张图片

图1.python-docx的安装及安装结果 

为了校验python-docx是否已经安装在我们的python library(python 库)中,我们可以使用以下命令进行查询:

#使用 pip list 命令,查看所有已安装的 python library(库)

pip list

如下图所示,在我输入了上述命令后,可以看到我们的python中存在的所有library(库),红色框选部分即为我们刚刚安装的python-docx,版本为0.8.11

第一章:python-docx 基础知识_第2张图片

 图2.使用 pip list 查看安装结果

通过我们使用 pip install python-docx 命令进行安装,使用 pip list 命令进行查看,我们已经成功的安装了 python-docx 库,然后就可以开始研究如何使用它啦。

如何使用python-docx呢?


        在我们正确安装python-docx后,就可以开始使用python-docx为我们进行创造了。在python中,无论要使用哪一个库,都需要对你要使用的库进行引入操作。在这里涉及到一个基础的知识点,就是在 python 中,如何引用我们想要使用的库。讲解如何使用 python-docx 前,我们先讲解一下 python 中引入库的基础操作,照顾一下可能存在的、像我一样的新人及小白,理解 from、import的大神直接跳过。

        一般在 python 当中,引入一个库或模块的方法有以下几种:

        import AAA,通过 import 引入 AAA 库。

        from AAA import BBB,通过 from 和 import 结合,从 AAA 库中引入 BBB 函数供我们使用。

        from AAA import *,通过 from 和 import 结合,从 AAA 库中引入所有的函数。

        from AAA import BBB, CCC,通过 from 和 import 结合,从 AAA 库中引入 BBB 函数和 CCC 函数供我们使用。

        为了照顾一些可能存在的小白,我把上面的每一个模块引入方式来墨迹一下子吧,如有解释不对的地方,欢迎来自四海八荒的各路大神批评指正。

        1.关于 import AAA

        如果我们直接使用 import + 库名/模块名,得到的结果就是:把整个库/模块作为一个相对路径引入到 python 中,引入之后,如果我们想使用被引入的库/模块中的函数,则需要使用“.”的方式引用某个函数。代码如下:

# 我们这个程序用来说明 import,以 time 库/模块作为样例

# 我们要实现的内容为:程序 10 秒后,用 print 命令输出 “ 今天是个好天气。 ”

# 使用 import 引入 time 库/模块
import time

# 使用 time 库/模块中的 sleep() 函数延迟十秒

# 因为我们引入的是整个 time 库/模块,所以使用这个库所包含的 sleep() 函数,
# 就需要写成 time.sleep()的形式,意思是,我要使用 time 中的 sleep()。
time.sleep(10)

# 利用 print() 函数输出“ 今天是晴天。 ”
print("今天是晴天。")

# 因为我们利用 import 引入整个 time,所以可以使用 time + "." + 函数名的方式,使用 time 库中的所有函数。

注:因为我们利用 import 引入整个 time,所以可以使用 time + "." + 函数名的方式,使用 time 库中的所有函数。       

        2.关于from AAA import BBB

        如果我们使用 from + 库/模块名 + import + 函数名,得到的结果就是:把某个库/模块中的某个函数引入到 python 中,引入之后,我们可以直接使用我们引入的函数。函数可以直接使用,不需要加模块名,但只能使用我们引入的函数,被引用库中的其余函数无法使用,代码如下:

# 我们这个程序用来说明 from import,以 time 库/模块作为样例

# 我们要实现的内容为:程序 10 秒后,用 print 命令输出 “ 今天是个好天气。 ”

# 使用 from import 引入 time 库/模块中的 sleep() 函数。
from time import sleep

# 因为我们引入的是 time 库中的 sleep函数,所以我们直接使用 sleep 即可。
# 你输入了 sleep() 后,python 知道,你的 sleep 是 time 中的 sleep。
sleep(10)

# 下面这行代码会报错,提示你 time 是个未知的东西,因为你压根没引入 time,而是引入的 time 中的sleep。
time.sleep(10)

# 利用 print() 函数输出“ 今天是晴天。 ”
print("今天是晴天。")

# 因为我们利用 from import 引入的只是 time 中的 sleep 函数,所以 time 中的其它函数,我们就无法使用了,因为你只引入了 sleep 啊。

注:因为我们利用 from import 只引入了time中的sleep函数,time中的其它函数就无法使用了,除非再次引用其它函数。   

        3.from AAA import *

        如果我们使用 from + 库/模块名 + import + *,得到的结果就是:把某个库/模块中的所有函数都引入进来,所有函数都可以直接使用,不需要加模块名和 “.”。代码如下:

# 我们这个程序用来说明 from import *,以 time 库/模块作为样例

# 我们要实现的内容为:程序 10 秒后,用 print 命令输出 “ 今天是个好天气。 ”

# 使用 from import 引入 time 库/模块中的所有函数。
from time import *

# 因为我们引入的是 time 库中的所有函数,所以 time 库中的所有函数都可以直接使用。
sleep(10)


# 下面这行代码会报错,提示你 time 是个未知的东西,因为你压根没引入 time,而是引入的 time 中的所有函数。
time.sleep(10)
mktime((2023,1,1,1,1,1,0,0,0))
strptime('2023-05-15 12:37:06', '%Y-%m-%d %X')

# 利用 print() 函数输出“ 今天是晴天。 ”
print("今天是晴天。")

# 因为我们利用 from import * 引入的只是 time 中的所有函数,所以 time 中的所有函数都可以不用加time和“.”而直接使用。

 注:因为我们利用 from import 引入了time中的所有函数,那么只要是time中的函数,就可以直接引用,无需使用 time + "." + 函数名的方式。 

        4.from AAA import BBB, CCC

        如果我们使用 from + 库/模块名 + import + 函数名+“,”+函数名,得到的结果就是:把某个库/模块中的某两个或多个函数引入到 python 中,引入之后,我们可以直接使用我们引入的函数。函数可以直接使用,不需要加模块名,但只能使用我们引入的函数,被引用库中的其余函数无法使用,代码如下:

# 我们这个程序用来说明 from import,以 time 库/模块作为样例

# 我们要实现的内容为:程序 10 秒后,用 print 命令输出 “ 今天是个好天气。 ”

# 使用 from import 引入 time 库/模块中的 sleep() 和 mktime() 函数。
from time import sleep,mktime

# 因为我们引入的是 time 库中的 sleep 和 mktime 函数,所以我们直接使用 sleep 和 mktime 即可。
# 你输入了 sleep() 后,python 知道,你的 sleep 是 time 中的 sleep,mktime 同理。
sleep(10)
mktime((2023,1,1,1,1,1,0,0,0))

# 下面这行代码会报错,提示你 time 是个未知的东西,因为你压根没引入 time,而是引入的 time 中的sleep 和 mktime。
time.sleep(10)

# 利用 print() 函数输出“ 今天是晴天。 ”
print("今天是晴天。")

# 因为我们利用 from import 引入的只是 time 中的 sleep 和 mktime 函数,所以 time 中除 sleep 和mktime 以外的其它函数,我们就无法使用了,因为你只引入了 sleep 和 mktime 啊。

注:因为我们利用 from import 只引入了 time 中的 sleep 和 mktime 函数,time中的其它函数就无法使用了,除非再次引用其它函数。 

        通过上述讲解,我们知道了 python 中,如何引用 标准库 或 第三方库,以及如何引用目标库中的函数,现在我们开始来看一下按照上述方式引用 python-docx。前文中的代码样例,我们引用的库为 time 库,而本专栏主要讲解的库为 python-docx,所以我们只需要按照上述样例中的样子,把 time 换成 docx,把各种函数替换成 python-docx 中的函数,便完成了对 python-docx 的引用。代码如下所示:

# 按照第一种方式,将 docx 按照相对路径的方式,引入到 python 中

import docx

# 我们已经完成了对 python-docx 库的引用,现在,我们可以通过 docx + “.” 的方式调用它的所有函数。

        那,肯定会有人要问的,docx 库中都有什么函数是我们可以引用的呢?现在我们来看一下 docx 库中,都有什么函数。查看方法如下图所示,我们需要借助一个标准库中的函数:dir()。

# 我们先引入需要查询函数的库名,python-docx 的库名为 docx
import docx

# 引入库后,我们使用 dir() 函数,查看 docx 都有那些函数。并把返回来的结果交给变量 functionList,好吧,如果变量都不知道是啥意思的话,你可以理解为一个存储东西的空罐子。
functionList = dir(docx)

# 查看结果
print(functionList)

输出结果如下图所示:

第一章:python-docx 基础知识_第3张图片

        docx 库中,可供我们使用的函数分别为:Document, ImagePart, RT, __builtins__, __cached__, __doc__, __file__, __loader__, __name__, __package__, __path__, __spec__, __version__, api, blkcntnr, compat, dml, document, enum, exceptions, image, opc, oxml, package, parts, section, settings, shape, shared, styles, text。

        在后面的文章中,我会对上面的每一个函数进行详细的讲解。我们最先需要掌握的函数为:Document,它实现的功能,是为我们打开一个docx文档等待后面的处理,你可以理解为:把我们要切得菜(要处理的文档)先放在菜板(python)上,等着我们拿刀切,它的使用方法为:

# 我们先引入 docx 库,以便 python 知道用什么方法处理我们的需求。
import docx

# 通过上文我们知道,Document 函数是 docx 库中的函数,作用为打开一个 docx 文档,等到我们处理。
# 我们的引用方式为引用一个库作为相对路径,所以要使用的每一个函数都需要写成 库名+点+函数名,即为:docx + “.” + 函数名。
# 我们处理任何文当前,肯定都需要先把文档打开,所以我们要做的第一步为:
# 使用 Document 函数 打开文档,并把打开后返回的数据交给一个变量。

# 使用 Document 打开一篇文档,并把文档交给 docTmp 这个变量,后面只需要对 docTmp 这个变量进行操作即可。
# docTmp = docx.Document("文件所在的路径")

# 路径的第一种表达方式:斜线换双斜线,否则会出错。
docTmp = docx.Document("D:\\M\py file\\练习材料\\demo1.docx")

# 路径的第二种表达方式:路径前加r,加在引号外面,否则会出错。
docTmp = docx.Document(r'D:\M\py file\练习材料\demo1.docx')

这里在实操过程中,可能会涉及相对路径和绝对路径的相关知识,如果不明白是什么意思的话,大家可以先自行百度一下,如果还没搞明白,或者上述过程中(如安装、引用等)存在什么搞不懂的问题,可以给我留言,看到消息第一时间为大家解决。

 今天主要为大家讲解了一下我认识python-docx的过程、python-docx是个啥东西、如何安装、如何使用,下一篇文章将以实操的方式,为大家讲解python-docx处理word中的各种函数、方法、过程。文章写得很基础,应该会让大多数人都看得懂,如有不对的地方,希望大家批评指正哈。

你可能感兴趣的:(python-docx,python,开发语言)