當前位置: 妍妍網 > 碼農

Python辦公神器:教你使用python批次整理通知檔

2024-04-25碼農

你是否遇到過這樣的情況:你有一堆Word檔,每個檔都包含一些重要的資訊,你需要把這些資訊提取出來,整理到一個Excel表格中,方便查閱和管理。但是,手動開啟每個檔,復制貼上資訊,又太費時費力,而且容易出錯。

有沒有什麽辦法可以讓Python幫你自動完成這個任務呢?答案是肯定的!本文將教你如何用Python批次提取Word檔中的關鍵資訊,並寫入Excel檔中,只需幾行程式碼,就可以節省大量的時間和精力。

準備工作

在開始編寫程式碼之前,我們需要先準備一些必要的工具和檔:

  • Python環境:本文使用的是Python 3.8,你可以在下載安裝。

  • openpyxl庫:這是一個用於操作Excel檔的Python庫,你可以使用 pip install openpyxl 命令安裝。

  • python-docx庫:這是一個用於操作Word檔的Python庫,你可以使用 pip install python-docx 命令安裝。

  • glob庫:這是一個用於獲取檔路徑的Python庫,一般已經內建在Python中,無需安裝。

  • Word檔:這是我們要提取資訊的原始檔,本文以7個會議通知檔為例,每個檔都包含學習時間、學習內容、學習形式、主持人四項關鍵資訊,檔名分別為會議通知1.docx,會議通知2.docx,...,會議通知7.docx,存放在Notice資料夾下。

  • Excel檔:這是我們要寫入資訊的目的檔,本文以一個空白的Excel檔為例,檔名為Meeting_temp.xlsx,存放在與Notice資料夾同一級的目錄下。

  • 獲取檔路徑

    第一步,我們需要獲取Notice資料夾下的所有Word檔的路徑,這樣我們才能對每個檔進行操作。這裏我們可以使用glob庫的glob函式,它可以根據通配符匹配檔路徑,返回一個列表。例如,我們可以使用 glob.glob('*.docx') 來匹配當前目錄下的所有以.docx結尾的檔。

    為了方便後續的操作,我們先定義一個變量path,表示我們的工作目錄,也就是Notice資料夾和Excel檔所在的目錄,你可以根據實際情況修改。然後,我們使用 glob.glob(path + r'\Notice\*.docx') 來獲取Notice資料夾下的所有Word檔的路徑,保存在一個變量files中。註意,這裏我們使用了r字串,表示原始字串,不會對反斜杠進行轉義。

    程式碼如下:

    import glob
    path = r'C:\Users\xxx'# 路徑為Notice資料夾和Excel檔所在的目錄,可按實際情況更改
    files = glob.glob(path + r'\Notice\*.docx'# 獲取Notice資料夾下的所有Word檔的路徑
    print(files) # 打印檔路徑列表,檢查是否正確

    輸出如下:

    ['C:\\Users\\xxx\\Notice\\會議通知1.docx', 'C:\\Users\\xxx\\Notice\\會議通知2.docx', 'C:\\Users\\xxx\\Notice\\會議通知3.docx', 'C:\\Users\\xxx\\Notice\\會議通知4.docx', 'C:\\Users\\xxx\\Notice\\會議通知5.docx', 'C:\\Users\\xxx\\Notice\\會議通知6.docx', 'C:\\Users\\xxx\\Notice\\會議通知7.docx']

    解析Word檔

    第二步,我們需要解析每個Word檔,獲取需要的四個資訊,即學習時間、學習內容、學習形式、主持人。這裏我們可以使用python-docx庫的Document類,它可以讀取Word檔,並將其內容以段落(Paragraph)為單位進行劃分。我們可以遍歷每個段落,根據其文本內容,判斷是否包含我們需要的資訊,並提取出來。

    為了方便後續的操作,我們先定義一個變量number,表示序號,用於記錄每個檔的順序。然後,我們使用一個for迴圈,遍歷files列表中的每個檔路徑,使用Document類開啟每個檔,保存在一個變量wordfile中。接著,我們定義一個空列表content_lst,用於存放學習內容,因為學習內容可能分散在多個段落中,我們需要將它們合並成一個字串。然後,我們使用一個巢狀的for迴圈,遍歷wordfile中的每個段落,根據其文本內容,判斷是否包含我們需要的資訊,並提取出來,保存在相應的變量中。具體的判斷邏輯如下:

  • 如果段落的文本以「學習時間:」開頭,那麽我們就提取其後面的部份,保存在一個變量study_time中。

  • 如果段落的文本以「主持人:」開頭,那麽我們就提取其後面的部份,保存在一個變量host中。

  • 如果段落的文本以「學習形式:」開頭,那麽我們就提取其後面的部份,保存在一個變量study_type中。

  • 如果段落的文本的長度大於等於2,且第一個字元是數位,第二個字元是中文頓號「、」,那麽我們就認為這是學習內容的一部份,將其添加到content_lst中。

  • 程式碼如下:

    from docx import Document
    number = 0# 定義一個變量,表示序號
    for file in files: # 遍歷每個檔路徑
    wordfile = Document(file) # 開啟每個檔
    content_lst = [] # 定義一個空列表,用於存放學習內容
    for paragraph in wordfile.paragraphs: # 遍歷每個段落
    if paragraph.text[0:5] == '學習時間:'# 如果段落的文本以「學習時間:」開頭
    study_time = paragraph.text[5:] # 提取其後面的部份,保存在study_time中
    if paragraph.text[0:4] == '主持人:'# 如果段落的文本以「主持人:」開頭
    host = paragraph.text[4:] # 提取其後面的部份,保存在host中
    if paragraph.text[0:5] == '學習形式:'# 如果段落的文本以「學習形式:」開頭
    study_type = paragraph.text[5:] # 提取其後面的部份,保存在study_type中
    if len(paragraph.text) >= 2# 如果段落的文本的長度大於等於2
    if paragraph.text[0].isdigit() and paragraph.text[1] == '、'# 如果第一個字元是數位,第二個字元是中文頓號「、」
    content_lst.append(paragraph.text) # 將其添加到content_lst中
    content = ' '.join(content_lst) # 將content_lst中的元素用空格連線成一個字串,保存在content中
    print(study_time, content, study_type, host) # 打印提取的資訊,檢查是否正確

    寫入Excel檔

    第三步,我們需要將提取的資訊寫入Excel檔中,這樣我們就可以方便地檢視和管理。這裏我們可以使用openpyxl庫的Workbook類和Worksheet類,它們可以建立和操作Excel檔和工作表。我們可以使用Workbook類的active內容,獲取當前活動的工作表,保存在一個變量sheet中。然後,我們可以使用Worksheet類的cell方法,根據行號和列號,指定單元格,並給其賦值。

    為了方便後續的操作,我們先定義一個變量excel_file,表示我們要寫入的Excel檔的路徑,你可以根據實際情況修改。然後,我們使用Workbook類建立一個Excel檔物件,保存在一個變量wb中。接著,我們使用wb的active內容,獲取當前活動的工作表,保存在一個變量sheet中。然後,我們使用sheet的cell方法,給第一行的每一列賦值,作為表頭,分別是序號、學習時間、學習內容、學習形式、主持人。接下來,我們使用一個for迴圈,遍歷files列表中的每個檔路徑,使用Document類開啟每個檔,保存在一個變量wordfile中。然後,我們使用和上一步相同的邏輯,提取每個檔中的四個資訊,保存在相應的變量中。最後,我們使用sheet的cell方法,給每一行的每一列賦值,分別是序號、學習時間、學習內容、學習形式、主持人。註意,這裏我們需要將序號加1,因為第一行已經被表頭占用了。最後,我們使用wb的save方法,保存Excel檔。

    程式碼如下:

    from openpyxl import Workbook
    excel_file = path + r'\Meeting_temp.xlsx'# 定義Excel檔的路徑,可按實際情況更改
    wb = Workbook() # 建立一個Excel檔物件
    sheet = wb.active # 獲取當前活動的工作表
    sheet.cell(row=1, column=1).value = '序號'# 給第一行第一列賦值,作為表頭
    sheet.cell(row=1, column=2).value = '學習時間'# 給第一行第二列賦值,作為表頭
    sheet.cell(row=1, column=3).value = '學習內容'# 給第一行第三列賦值,作為表頭
    sheet.cell(row=1, column=4).value = '學習形式'# 給第一行第四列賦值,作為表頭
    sheet.cell(row=1, column=5).value = '主持人'# 給第一行第五列賦值,作為表頭
    for file in files: # 遍歷每個檔路徑
    wordfile = Document(file) # 開啟每個檔
    content_lst = [] # 定義一個空列表,用於存放學習內容
    for paragraph in wordfile.paragraphs: # 遍歷每個段落
    if paragraph.text[0:5] == '學習時間:'# 如果段落的文本以「學習時間:」開頭
    study_time = paragraph.text[5:] # 提取其後面的部份,保存在study_time中
    if paragraph.text[0:4] == '主持人:'# 如果段落的文本以「主持人:」開頭
    host = paragraph.text[4:] # 提取其後面的部份,保存在host中
    if paragraph.text[0:5] == '學習形式:'# 如果段落的文本以「學習形式:」開頭
    study_type = paragraph.text[5:] # 提取其後面的部份,保存在study_type中
    if len(paragraph.text) >= 2# 如果段落的文本的長度大於等於2
    if paragraph.text[0].isdigit() and paragraph.text[1] == '、'# 如果第一個字元是數位,第二個字元是中文頓號「、」
    content_lst.append(paragraph.text) # 將其添加到content_lst中
    content = ' '.join(content_lst) # 將content_lst中的元素用空格連線成一個字串,保存在content中
    number += 1# 將序號加1
    sheet.cell(row=number+1, column=1).value = number # 給每一行第一列賦值,作為序號
    sheet.cell(row=number+1, column=2).value = study_time # 給每一行第二列賦值,作為學習時間
    sheet.cell(row=number+1, column=3).value = content # 給每一行第三列賦值,作為學習內容
    sheet.cell(row=number+1, column=4).value = study_type # 給每一行第四列賦值,作為學習形式
    sheet.cell(row=number+1, column=5).value = host # 給每一行第五列賦值,作為主持人
    wb.save(excel_file) # 保存Excel檔

    完成任務

    至此,我們已經完成了用Python批次提取Word檔中的關鍵資訊,並寫入Excel檔中的任務。你可以開啟Meeting_temp.xlsx檔,檢視結果,如下圖所示:

    你可以看到,我們成功地將7個Word檔中的四個資訊提取出來,並按照序號、學習時間、學習內容、學習形式、主持人的順序,寫入Excel檔中,方便查閱和管理。

    總結

    本文教你如何用Python批次提取Word檔中的關鍵資訊,並寫入Excel檔中,只需幾行程式碼,就可以節省大量的時間和精力。本文涉及到的主要技術點有:

  • openpyxl庫:用於操作Excel檔,可以建立、讀取、寫入、修改Excel檔和工作表。

  • python-docx庫:用於操作Word檔,可以讀取、寫入、修改Word檔和段落。

  • glob庫:用於獲取檔路徑,可以根據通配符匹配檔路徑,返回一個列表。

  • 希望本文對你有所幫助,如果你有任何問題或建議,歡迎在評論區留言。謝謝!

    PS Python都知道技術交流群(技術交流、摸魚、白嫖課程為主)又不定時開放了,感興趣的朋友,可以在下方公號內回復: 666 ,即可進入。

    老規矩 ,道友們還記得麽, 右下角的 「在看」 點一下 如果感覺文章內容不錯的話,記得分享朋友圈讓更多的人知道!