用Python寫(xiě)幾行代碼,一分鐘搞定一天工作量,同事直呼:好家伙!
點(diǎn)擊上方“Python爬蟲(chóng)與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注
回復(fù)“書(shū)籍”即可獲贈(zèng)Python從入門(mén)到進(jìn)階共10本電子書(shū)
前幾天有一個(gè)讀者說(shuō)最近要整理幾千份文件,頭都要整禿了,不知道能不能用Python解決,我們來(lái)看一下,你也可以思考一下。
由于涉及文件私密所以具體內(nèi)容已做脫敏處理。
大概是這樣,一個(gè)文件夾下有多份會(huì)議通知信息(本文以 7 份文件為例)

每一份通知打開(kāi)格式基本類(lèi)似,如下所示??
現(xiàn)在需要將每份會(huì)議文檔中的 學(xué)習(xí)時(shí)間、學(xué)習(xí)內(nèi)容、學(xué)習(xí)形式、主持人 四項(xiàng)關(guān)鍵信息提取出來(lái),整理到 Excel 表格中:
在他真實(shí)需求中,會(huì)議通知四年積累下來(lái)有快 1000 份(四年開(kāi)了這么多次會(huì)也是很厲害...),用人力挨個(gè)打開(kāi)文件并錄到 Excel 中工作量實(shí)在太大。
好家伙,這種重復(fù)的無(wú)聊工作, 不就是一份非常適合交給 Python 的自動(dòng)化工作嗎?我不允許我的粉絲還不會(huì)!
下面我們來(lái)看看如何用Python解決這個(gè)問(wèn)題,主要將涉及:
openpyxl寫(xiě)入 Excel 文件python-docx讀取 Word 文件glob批量獲取文件路徑
為了簡(jiǎn)化上面的需求,本文中需要獲取的會(huì)議通知文件一共 7 個(gè),分別命名為 會(huì)議通知1.docx 會(huì)議通知2.docx... 會(huì)議通知7.docx,存放在 Notice 文件夾下。輸出的目標(biāo) Excel 文件命名為 Meeting_temp.xlsx
基本邏輯
寫(xiě)代碼之前都先明確完整的問(wèn)題需要分為幾個(gè)小步驟實(shí)現(xiàn)。從需求中我們大概可以將代碼分為以下幾步:
“”
獲取會(huì)議通知 Notice 文件夾下的所有文件; 解析每一份 Word 文件,獲取需要的四個(gè)信息,輸出到 Excel 中; 保存 Excel 文件
有了邏輯就有了寫(xiě)代碼的思路了。第 1 步可以由 glob 庫(kù)完成,后面兩步就是操作 Word 的 python-docx 庫(kù)和操作 Excel 的 openpyxl 庫(kù)的交互協(xié)作了。
這兩個(gè)庫(kù)我們都有說(shuō)過(guò),如果你不熟悉,一定要先閱讀下面的文章!
代碼實(shí)現(xiàn)
首先導(dǎo)入需要的庫(kù):
from?docx?import?Document
from?openpyxl?import?load_workbook
import?glob
將模板 Excel 讀取進(jìn)程序:
path??=?r'C:\Users\xxx'?#?路徑為會(huì)議通知文件夾和?Excel?模板所在的位置,可按實(shí)際情況更改
workbook?=?load_workbook(path?+?r'\Meeting_temp.xlsx')
sheet?=?workbook.active
寫(xiě)任何批處理的代碼之前都建議先寫(xiě)一下單次操作的代碼,因此我們先完成對(duì) 會(huì)議通知 1.docx 文件的解析,確保無(wú)誤。現(xiàn)在對(duì)于文檔的結(jié)構(gòu)和關(guān)鍵信息的位置尚不明確,可以先將 Word 以段落 Paragraph 為單位輸出觀察:
wordfile?=?Document(path?+?r'\Notice\會(huì)議通知?1.docx')
for?paragraph?in?wordfile.paragraphs:
????print(paragraph)

文件的文字排布脈絡(luò)比較清晰,基本是一句話對(duì)應(yīng)一個(gè)段落,而需要的信息可以簡(jiǎn)單通過(guò)判斷每句話(每段話)前幾個(gè)字而明確:
????for?paragraph?in?wordfile.paragraphs:
????????if?paragraph.text[0:5]?==?'學(xué)習(xí)時(shí)間:':
????????????study_time?=?paragraph.text[5:]
????????if?paragraph.text[0:4]?==?'主持人:':
????????????host?=?paragraph.text[4:]
????????if?paragraph.text[0:5]?==?'學(xué)習(xí)形式:':
????????????study_type?=?paragraph.text[5:]
對(duì)于學(xué)習(xí)內(nèi)容的獲取比較特殊,不像其他三個(gè)信息,都在一句話中,且關(guān)鍵字就為前幾個(gè)字:
可以看到,“學(xué)習(xí)內(nèi)容” 四個(gè)字和真正包含的內(nèi)容分散在不同的句子中. 這里簡(jiǎn)單用一個(gè)策略:
“建立一個(gè)空列表存放,然后遍歷每一段判斷,如果一個(gè)字符為數(shù)字且第二個(gè)字符為中文頓號(hào)
”“、”就獲取存放到列表中。最后把列表中的元素重新組合成一個(gè)長(zhǎng)字符串即可:
????content_lst?=?[]
????for?paragraph?in?wordfile.paragraphs:
????????if?paragraph.text[0:5]?==?'學(xué)習(xí)時(shí)間:':
????????????study_time?=?paragraph.text[5:]
????????if?paragraph.text[0:4]?==?'主持人:':
????????????host?=?paragraph.text[4:]
????????if?paragraph.text[0:5]?==?'學(xué)習(xí)形式:':
????????????study_type?=?paragraph.text[5:]
????????if?len(paragraph.text)?>=?2:
????????????if?paragraph.text[0].isdigit()?and?paragraph.text[1]?==?'、':
????????????????content_lst.append(paragraph.text)
????content?=?'?'.join(content_lst)
完成了解析 Word 文件之后,就需要把內(nèi)容輸出的 Excel 文件中了。
簡(jiǎn)單來(lái)說(shuō),就是將上面代碼獲取到的幾個(gè)元素組合成一個(gè)列表,通過(guò) sheet.append(list) 的方法寫(xiě)入 Excel 文件中:
number?=?0?#?全局中設(shè)置一個(gè)變量用于計(jì)數(shù),做為序號(hào)輸出
wordfile?=?Document(path?+?r'\Notice\會(huì)議通知?1.docx')
content_lst?=?[]
for?paragraph?in?wordfile.paragraphs:
????if?paragraph.text[0:5]?==?'學(xué)習(xí)時(shí)間:':
????????study_time?=?paragraph.text[5:]
????if?paragraph.text[0:4]?==?'主持人:':
????????host?=?paragraph.text[4:]
????if?paragraph.text[0:5]?==?'學(xué)習(xí)形式:':
????????study_type?=?paragraph.text[5:]
????if?len(paragraph.text)?>=?2:
????????if?paragraph.text[0].isdigit()?and?paragraph.text[1]?==?'、':
????????????content_lst.append(paragraph.text)
content?=?'?'.join(content_lst)
number?+=?1
sheet.append([number,?study_time,?content,?study_type,?host])
單個(gè)文件解析完,用 glob 改完獲取文件夾下全部文件,建立循環(huán)逐個(gè)解析就能完成本需求,當(dāng)然最后記得保存 Excel 文件。
完整代碼如下??
from?docx?import?Document
from?openpyxl?import?load_workbook
import?glob
path??=?r'C:\Users\xxx'
workbook?=?load_workbook(path?+?r'\Meeting_temp.xlsx')
sheet?=?workbook.active
number?=?0
for?file?in?glob.glob(path?+?r'\Notice\*.docx'):
????wordfile?=?Document(file)
????content_lst?=?[]
????for?paragraph?in?wordfile.paragraphs:
????????if?paragraph.text[0:5]?==?'學(xué)習(xí)時(shí)間:':
????????????study_time?=?paragraph.text[5:]
????????if?paragraph.text[0:4]?==?'主持人:':
????????????host?=?paragraph.text[4:]
????????if?paragraph.text[0:5]?==?'學(xué)習(xí)形式:':
????????????study_type?=?paragraph.text[5:]
????????if?len(paragraph.text)?>=?2:
????????????if?paragraph.text[0].isdigit()?and?paragraph.text[1]?==?'、':
????????????????content_lst.append(paragraph.text)
????content?=?'?'.join(content_lst)
????number?+=?1
????sheet.append([number,?study_time,?content,?study_type,?host])
workbook.save(path?+?r'\Meeting_notice.xlsx')
核心也不過(guò)三十行代碼,總共不過(guò)三秒就搞定了!
-------------------?End?-------------------
往期精彩文章推薦:
手把手教你使用Python輕松搞定發(fā)郵件
手把手教你用Python制作簡(jiǎn)易小說(shuō)閱讀器
一篇文章總結(jié)一下Python庫(kù)中關(guān)于時(shí)間的常見(jiàn)操作

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~
