python读取只读word只读_人生苦短我学Python——Word处理之快速Word转PDF
上回書說到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 別名] 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python读取只读word只读_人生苦短我学Python——Word处理之快速Word转PDF的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zookeeper 创建临时顺序节点_Z
- 下一篇: pyqt5从子目录加载qrc文件_【JV