Python 辦公小助手:讀取 PDF 中表格並重命名

日常工作中,我們或多或少都會接觸到 Excel 表格、Word 文檔和 PDF 文件。偶爾來個處理文件的任務,幾個快捷鍵操作一下——搞定!但是,偏偏有些煩人的工作,操作繁瑣且數據複雜,更要命的是耗時間,吭哧吭哧一下午卻難出幾個成果。


此時如果我們掌握些 Python 編程的技巧,整理下文件處理的流程通過編碼來實現,不僅省時省力省心,還可以精進編碼技術。今天我們就通過一個 PDF 處理的實例來演示下 Python 助力辦公的過程。


上週朋友提了個 PDF 處理的問題,要求如下:


Python 辦公小助手:讀取 PDF 中表格並重命名


大致整理下,這問題和把大象裝冰箱一樣要分三步:


  1. 讀取 PDF 中的表格內容
  2. 在表格內容中提取特定數據
  3. 以特定數據對文件重命名


此時面向 Python 默默許願:要是 Python 中有現成的模塊可以直接讀取 PDF 中的表格就好了!


心願達成!確實有個 tabula 模塊可以直接解析 PDF 中的表格:

tabula-py is a simple Python wrapper of tabula-java, which can read table of PDF. You can read tables from PDF and convert into pandas's DataFrame. tabula-py also enables you to convert a PDF file into CSV/TSV/JSON file.

https://pypi.org/project/tabula-py/

如上所述, tabula-py 是 tabula-java 的一個封裝模塊,可以將 PDF 中的表格數據轉化為 pandas 的 DataFrame 格式。


注意,安裝 tabula-py 時命令是 pip install tabula-py,但導入時是 import tabula。


此外,該模塊由於是對 tabula-java 的封裝依賴 java,需要安裝 java 才能正常調用。並且由最終轉化得到的數據格式也可以看出,此模塊也依賴 pandas 和 numpy,需要自行導入。



<code>詳細鏈接:https://pypi.org/project/tabula-py//<code>


安裝好 tabula-py,我們也準備一份 PDF 文件(demo.pdf)用於演示代碼:


Python 辦公小助手:讀取 PDF 中表格並重命名


現在任務更清晰了:讀取 demo.pdf 文件中的 “批號(款號)”數據:



<code>"批號(款號)":"DRDY173131441HHDKD QWOEP23"/<code>


最終將這一串批號數據當作名字給 PDF 重命名,生成 DRDY...EP23.pdf 文件。




如果你能堅持看到這裡,我準備向你推薦下 jupyter notebook。因為它可以按代碼塊執行,上下代碼塊之間變量可以共用,同時會直接顯示代碼塊運行結果。拿它用來做代碼及運行結果展示非常好用——下文記錄的過程就是通過它運行代碼截圖所得。


1. 首先,導入 tabula,使用其函數讀取 PDF 中的表格數據:


Python 辦公小助手:讀取 PDF 中表格並重命名


由所得結果大致可以看出,我們想要的批號數據是在第二列。


2. 之前提到讀到的 PDF 表格數據是 DataFrame 格式,可以用 help 函數確認下:


Python 辦公小助手:讀取 PDF 中表格並重命名


3. 由表格數據中提取其每一列的名稱:


Python 辦公小助手:讀取 PDF 中表格並重命名


4. 根據目測分析,批號位於第二列,所以提取第二列名字:


Python 辦公小助手:讀取 PDF 中表格並重命名


5. 通過 DataFrame["列名稱"] 來定位到該列具體數據:


Python 辦公小助手:讀取 PDF 中表格並重命名


6. 通過 for 循環逐一打印此列數據,提取其中“批號”數據:


Python 辦公小助手:讀取 PDF 中表格並重命名


這裡直接採用的是 "批號" in 字符串 的語法,倘若數據字符串中含有“批號”二字就會被篩選出,最終我們也如願拿到了“批號數據”並賦值給 target 變量。


7. 拿到了“批號”數據,我們只選取字母數字拼接的數據串。接下來採用正則表達式,按照批號數據格式中只包含大寫字母、數字以及中間會夾雜空格,制定匹配模式進行匹配提取:


Python 辦公小助手:讀取 PDF 中表格並重命名


最終我們拿到了批號數據串賦值給 result 變量。


8. 最終我們利用 os 模塊將文件夾內的 “demo.pdf” 重命名為 result 所代表的批號數據串.pdf :


Python 辦公小助手:讀取 PDF 中表格並重命名


注意,這裡的 f"{變量}字符串內容" 是格式化字符串的形式。


至此,我們完成了對單份 PDF 處理的完整流程。接下來我們可以多試幾份不同 PDF 尋找共同的提取批號數據的規律,將其整理成連貫、簡潔的最終版代碼:














































<code>#!/usr/bin/env python# encoding: utf-8# @Time : 2019-10-24 21:39__author__ = 'Ted'import tabulaimport reimport os# 將提取單一 PDF 文件內批號數據的過程定義成 get_target("pdf名稱") 函數,最終函數將數據返回def get_target(filename):    df = tabula.read_pdf(filename)    pattern = r'[A-Z0-9]+[\\s]*[A-Z0-9]*'    for item_sub in df[df.columns[1]]:        if "批號" in str(item_sub):            result = re.search(pattern,item_sub).group()            return result    return Falseif __name__=="__main__":    # 獲取 PDF 所在文件夾    folder = "test"    # os 模塊定位到該文件夾    os.chdir(folder)    # 獲取文件夾內文件列表    pdflist = os.listdir()    # 打印該文件列表    print(pdflist)    # 對文件列表 for 循環處理    for item in pdflist:        # 如果該文件名稱最後四位是 .pdf 或 .PDF,即我們要找的 PDF 文件        if item[-4:] in [".pdf",".PDF"] :            # 對該文件進行提取批號函數操作,將批號數據賦值給 new_name            new_name = get_target(item)            # 如果不為空,即獲取到了批號數據            if new_name:                # 對文件進行重命名操作                os.rename(item,f"{new_name}.pdf")    print("重命名成功!")/<code>


如果我們有大量 PDF 文件都要提取文件內的批號數據進行重命名,可以將其放到同一個文件夾中,然後只要在最終代碼中修改 folder = "文件夾名稱",運行代碼等待幾秒,便可微微一笑任務搞定了。


分享到:


相關文章: