上回书说到Python对于Excel的操作,本回书咱们来说一说Python对于Word的操作。这次的需求是这样的:把若干个Word文档转换为PDF格式。起因呢,是因为公司经常会披露公告、法律文件等,这些文件在编辑的时候都是以Word的形式,而正式发布的时候则需要是PDF格式,可能有的时候数量比较多就不能手工一个个转换而需要批量转换工具。

有同学可能会问,网上工具那么多,甚至还有在线转换的,为啥还要自己写代码?

那还用问?自己写代码显得牛X呀。

开个玩笑,正经的原因如下:

1、 用软件或在线转换不太安全,尤其是保密文件

2、 有些公司对于软件下载安装有严格的策略控制

3、 市场上各类软件良莠不齐,小心“中招”

话不多说了,先看代码和结果。

Python代码
代码执行结果
PDF文件转换结果

01 win32com是模块吗?为什么pypi搜索不到?

还记得上回我们在操作Excel的时候,用到了“模块”这一概念,当时“模块”是采用从http://pypi.org下载安装的方式得到的。而本次,我们使用比模块更深奥的“库”。通俗理解下,包包含“模块”;库包括好多“包”;框架继承了多个“库”。从本质上来说,这些东西都是“模块”,其用法也都比较类似。那么本次我们使用的win32com正是属于库中的一个包,它是涵盖在pywin32这个库中的。因此我们需要pip安装pywin32才能使用win32com这个包。

我们来看代码当中的第一句:

from 

这句代码的意思就是引入win32com包中的client模块,但仅引入Dispatch,constants,gencache这三个成员。如果引入client模块的所有而不限制成员可以写为:

from 

但是如果引入所有,那么在接下来代码中,都要使用“包.成员名”这一形式来进行使用,如果数量比较少的话还好,但是多了就会比较麻烦。更多的引入方式及说明请见附录。

这里再给大家简单介绍一下pywin32。pywin32是一个第三方模块库,直接包装了几乎所有的Windows API,主要的作用是使Python开发者可以方便快速的调用Windows API。同时pywin32也是绝大部分windows上第三方python模块库的前提,例如wmi,如果没有安装pywin32是无法正常使用wmi这个第三方模块库的。

引入client模块的所有而不限制成员的写法

02 逐句分解

新概念就说到这,接下来进行需求及代码分解。我们这个程序采用的是模仿人操作的方式,调用VBA实现这一过程。那么,要实现Word转PDF这一需求,如果是你,你会怎么操作?

1、 打开所要转换的一个Word文件

2、 点击文件-另存为

3、 下拉框选择PDF格式-保存

4、 循环打开下一个Word文件

通过上述流程,我们深入考虑一下,如果是程序呢,应该会包括些什么步骤?

首先最主要的肯定是一个循环,因为我们需要反复读取Word直到将所有Word都转成了PDF;其次应该就是转换了,在VBA中,我们可以使用wdExportFormatPDF代替人工下拉框选择PDF格式-保存这一操作;最后就是命名了,我们需要的是转换后的PDF和转换前的Word同名,因此对于名称我们也需要进行处理。

分析完成,那我们的程序也逐渐清晰了,我将核心内容摘出来一句句解释:

if file.split('.')[-1] in ['docx','doc']:

这句主要的作用是找出文件夹内的所有Word文档。我们都知道Word文档一般都是.docx和.doc结尾的,那我这里采用的是将文件名按.分割为两部分,找到第二部分属于['docx','doc']的文件进入循环。

pdf_path=word_path.replace('docx','pdf').replace('doc','pdf')

定义生成的PDF路径,我采用的是生成的PDF在原路径,你也可以按需定义。

doc = wd.Documents.Open(word_path,ReadOnly=1)

以只读方式打开当前Word。

doc.ExportAsFixedFormat(pdf_path, constants.wdExportFormatPDF)

这句是整个程序的核心部分,它所实现的功能就是调用VBA函数,使Word转换成PDF。VBA函数的语法是这样的:

ExportAsFixedFormat(OutputFileName、 microsoft.office.infopath.exportformat、 OpenAfterExport、 OptimizeFor、 Range、 From、 To、 Item、 IncludeDocProps、 KeepIRM、 CreateBookmarks、DocStructureTags、 BitmapMissingFonts、 UseISO19005_1、 FixedFormatExtClassPtr)

具体函数用法可参见微软提供的官方说明:https://docs.microsoft.com/zh-cn/office/vba/api/word.document.exportasfixedformat

03 进阶一下

我们再来看一下这句代码

pdf_path=word_path.replace('docx','pdf').replace('doc','pdf')

它的意思是将文件的拓展名docx和doc替换为pdf,生成正常的pdf名。细心的你会不会有疑问,如果Word文件名中就含有docx或doc,那不是也被替换了?

没错!使用replace函数替换确实会存在这个问题,它会将所有检测到的字符都替换掉。那么有没有别的函数,只替换掉末尾的docx和doc?

函数我暂时没找到,如果你知道请一定告诉我。

我这里要介绍的是采用正则表达式这一方法。正则表达式描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。学会灵活运用正则表达式,可以让你的字符串的处理是事半功倍。具体详细的介绍网上都有,请大家自行查阅,我这里就抛砖引玉介绍本次用到的两个。

$:匹配输入字符串的结尾位置。要匹配 $ 字符本身,请使用 $。

|:指明两项之间的一个选择。要匹配 |,请使用 |。

基于上述两个字符,结合我们的目标:获取以docx或doc结尾的子串,那么可以通过这两种代码实现:

doc$|docx$
(doc|docx)$

我们已经简单了解了正则表达式,且已经成功用正则表达式获取了子串,那Python又是如何与正则表达式进行结合的呢?

这里我们就要引入一个新的模块:re。re是正则表达式的英文(regular expression)的首字母,在Python中若需要使用正则表达式,那就需要引入re。具体该需求的实现,见下图示例。

正则表达式实例
执行结果

具体的需求就到此为止了,关于pywin32和正则表达式更多的内容,还需要去不断学习呢~

附录

导入模块的方式:

import 模块名1 [as 别名1], 模块名2 [as 别名2],…

使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。

from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…

使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。

导入包类似:

import 包名[.模块名 [as 别名]]
from 包名 import 模块名 [as 别名]
from 包名.模块名 import 成员名 [as 别名]

python读取只读word只读_人生苦短我学Python——Word处理之快速Word转PDF相关推荐

  1. python删除文件夹无法访问_人生苦短 我学Python——anaconda和Jupyter notebook安装使用...

    一.人生苦短 我学Python 为什么学习Python? 1.应用范围广 很多网站是用Python开发的,比如豆瓣,还有YouTube等等. 2.效率高,和其他编程语言对比,可以用少得多的代码写出相同 ...

  2. python能开发什么产品_三周学 Python ?不,三周做个产品

    我的同事在看到毫无开发经验的我用三周时间,不但从零基础用上了 Python,还做出了一个客户关系管理系统,强烈邀请我分享经验.惶恐,因为我并没有出色的智商,也没有觉得三周学 Python 是一个体现自 ...

  3. 小白学习python好还是java好_小白应该学Python还是Java?

    Java和Python两门语言都是目前非常热门的语言,可谓北乔峰南慕容,二者不分上下,棋逢对手.但是对于初学者来说,非常困惑,因为时间和精力有限,上手必须要先学一门,到底选那个好呢,今天3分钟带你透彻 ...

  4. python语言程序设计难不难_零基础学Python编程开发难度大吗?从哪学起?

    转行零基础学Python编程开发难度大吗?从哪学起? 近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大? 今天,小编就来为大家详细解读一下这个问题. ...

  5. python画六边形的代码_跟我学python(1)——turtle

    嗨!大家好,欢迎大家跟我一起学习python,那首先我们需要先了解什么是编程?什么是python? python1-0 我们不套用百度或者其他官方的解答,就我的理解来说,编程是一门语言,就像英语可以让 ...

  6. python中for循环缩进_跟小白学Python数据分析——For循环

    原标题:跟小白学Python数据分析--For循环 循环是指反复地连续做某件事,例如地球绕地轴自转一圈就是一天,自转的同时绕太阳公转一圈就是一年.周而复始,转了一圈又一圈,一次又一次地循环. 在编程过 ...

  7. python送程序员收入_程序员学Python后惊叹,这么丰厚的收入是Java给不了的!

    原标题:程序员学Python后惊叹,这么丰厚的收入是Java给不了的! 你都用 Python 来做什么?? 发现很多人都在学习 Python ,但是没有明确的说明可以做什么,主流的功能是什么? 想知道 ...

  8. python画图库哪个好_小白开始学Python最著名的绘图库

    这是菜鸟学Python的第101篇原创文章 阅读本文大概需要3分钟 数据分析里面可视化是重要的环节,辛苦把数据采集,然后经历了很多工序的清洗之后,最后要展现给用户,最好的方法就是数据可视化.数据可视化 ...

  9. 0基础学python需要多长时间_零基础学python大概要多久

    如果是自学的话,零基础学python大概要花一年到一年半的时间.每个人的资质不同.理解能力不同,所以花费的时间也不一样.建议零基础的学员报一个python培训班,这样可以有规划的系统性学习,而且花费的 ...

  10. python 少儿趣味编程下载_零基础学Python编程(少儿趣味版)

    本书是一本少儿编程入门书,适合零基础的读者.本书以"派森号"飞船和西西船长等人的童话故事为载体,从头开始介绍了Python语言的基础语法.全书共有6个章节.每章都有约十个独立的内容 ...

最新文章

  1. 华北赛区,我们来啦!
  2. 网站真分页js代码该怎么写? 1
  3. 一个故事讲清楚BIO NIO 异步
  4. LINUX SHELL的神器,sed
  5. Table隔行变色的JavaScript代码
  6. vivado中的OOC技术
  7. Windows命令查看文件MD5
  8. Sklearn中的二分类模型可以进行多分类的原理
  9. 数字资产期权新手入门手册 | TokenInsight
  10. 【考研数学】二. 一元函数积分学
  11. [转载]探索J2ME:用GCF通信
  12. N卡显卡驱动更新,解决色彩准确度增强的问题
  13. 1143 Lowest Common Ancestor (30分) 附测试点分析
  14. wow私服,arcemu trunk源码编译架设
  15. python中for c in s是什么意思_以下程序s=3for c in Python:s=s+2print(s)的输出结果是:()...
  16. Python环境下数据处理常用命令
  17. JavaScript-ES7~ES8新特性使用教程
  18. ios使用lua详解
  19. VS Warring
  20. Android实现打开手机淘宝并自动识别淘宝口令弹出商品信息功能

热门文章

  1. python解析树_如何使用python中的stanford解析器获取树的叶子?
  2. python的类变量和成员变量用法_Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析...
  3. unity Android 指南针,Unity之一天一个技术点(十二)---指南针的实现
  4. UVA 11401 Triangle Counting(详解)
  5. 正态分布图_用EXCEL简易制作正态分布图
  6. 返回的到的数据做整合_Excel玩转数据分析常用的43个函数!(建议收藏)
  7. 2013豆瓣校园招聘研发类笔试题
  8. 西北工业大学复试上机
  9. UVa 1636 决斗
  10. mac os 切换网络优先级