
來源:早起Python
作者:陳熹
40個Python辦公自動化案例合輯
大家好,我是早起。本文將分享一個常見辦公場景下的Python自動化案例,主要將涉及以下兩個內(nèi)容
有一個文件夾 貨物清單 中含有多張貨物清單的影印版 PDF,分別命名為 文件 (1).pdf 文件 (2).pdf ... 文件 (20).pdf,如下所示:
PDF 是純圖片類型,里面的文字信息無法手動復(fù)制,同時本例中所有的圖片都向左旋轉(zhuǎn) 90 度,大致如下圖所示(馬賽克部分為無關(guān)內(nèi)容):
我們需要做的是 「 獲取圖中紅框部分 TRACKING# 以及 REF2 冒號后的字符串,用 & 連接后重命名這個 PDF 文件 」 !
也就是需要根據(jù)每個PDF內(nèi)容來批量重命名一大堆文件,最終效果如下
本需求是一個批處理問題,即需要對諸多文件執(zhí)行類型的操作,基本思路是先完成對一份文件的處理,然后借助 glob 模塊獲取指定路徑所有符合要求的文件路徑,執(zhí)行批處理框架,固后面的操作先針對 文件 (1).pdf
需求中最大的難題在于,PDF 是圖片類型,無法按常規(guī)方法提取文件。解決思路是利用光學(xué)字符識別(OCR)將圖片中的文字識別出,然后進(jìn)行后續(xù)操作,這里就涉及到一些先后順序:
將圖片向右旋轉(zhuǎn)回正位
截取需要識別的部分圖片
將截取的圖片交給 OCR 獲取字符串
為了完成 OCR,需要在電腦上安裝三個軟件:
Ghostscript 32 位
ImageMagick 32 位
tesseract-OCR 32 位
三個軟件的下載安裝沒有特殊的地方(tesseract 配置稍復(fù)雜但網(wǎng)絡(luò)有上諸多教程,這里不再贅述),讀者可自行搜索下載及配置
首先導(dǎo)入需要的模塊:
from wand.image import Image
from PIL import Image as PI import pyocr import pyocr.builders import io import glob import re import os import shutil
具體的模塊用途可以參考下面具體代碼。其中 wand 和 pyocr 由于是非標(biāo)準(zhǔn)庫需要自行額外安裝。打開命令行輸入:
pip install wand
pip install pyocr
作為測試以及方便后面的實際運行,需求中的 貨物清單 這一文件夾可以放在桌面上。為了獲取其中的內(nèi)容首先我們要明確桌面的路徑。每個人每臺電腦的桌面路徑都不相同,如果直接復(fù)制當(dāng)前電腦桌面的路徑,更換電腦或者其他用戶調(diào)試就需要額外修改。可通過下面基于 os 模塊的代碼獲取桌面路徑:
# 獲取桌面路徑包裝成一個函數(shù) def GetDesktopPath(): return os.path.join(os.path.expanduser("~"), 'Desktop')
path = GetDesktopPath() + r'貨物清單' # 獲取 貨物清單 文件夾路徑
獲取配置好的 tesseract 便于后面調(diào)用:
tool = pyocr.get_available_tools()[0]
以 文件 (1).pdf 為例,通過 wand 模塊將 PDF 文件轉(zhuǎn)化為分辨率為 300 的 jpeg 圖片形式:
image_pdf = Image(filename=path + r'文件 (1).pdf', resolution=300)
image_jpeg = image_pdf.convert('jpeg')
將圖片解析為二進(jìn)制矩陣:
image_lst = [] for img in image_jpeg.sequence:
img_page = Image(image=img)
image_lst.append(img_page.make_blob('jpeg'))
用 io 模塊的 BytesIO 方法讀取二進(jìn)制內(nèi)容為圖片形式:
new_img = PI.open(io.BytesIO(image_lst[0]))
由于圖片現(xiàn)在處于左旋 90 度的水平位,將其轉(zhuǎn)為正位可以用 rotate() 方法,注意該方法是逆時針旋轉(zhuǎn),因此回正位需要逆時針旋轉(zhuǎn) 270 度。完善上面的代碼,并為 new_img.show() 預(yù)覽圖片:
new_img = PI.open(io.BytesIO(image_lst[0])).rotate(270)
new_img.show()
彈出圖片并恢復(fù)到了正位,接下來分別截取需要提取部位字符串的圖片了,盡量讓圖片中只有需要識別的部分,獲取識別出來容易簡單處理獲得需要的內(nèi)容 截取圖片用 image.crop((left, top, right, bottom)) 四個參數(shù)需要反復(fù)調(diào)試才能確定。首先提取 TRACKING# 部位需要的內(nèi)容,經(jīng)確定四個參數(shù)分別是 350 600 1350 730,嘗試截取和預(yù)覽圖片:
### 解析1Z開頭碼 left = 350
top = 600
right = 1300
bottom = 730
image_obj1 = new_img.crop((left, top, right, bottom))
image_obj1.show()
截取成功后可以交給 OCR 了,代碼為 tool.image_to_string()
txt1= tool.image_to_string(image_obj1) print(txt1)
通過正則提取紅框內(nèi)需要的內(nèi)容:
req = 'TRACKING #: (.*)' txt1_real = ''.join(re.findall(req, txt1)[0].split()) print(txt1_real)
用同樣的辦法也可以提取另一個紅框的文字:
### 解析C開頭碼 left = 205 top = 1170 right = 2450 bottom = 1200 image_obj2 = new_img.crop((left, top, right, bottom)) txt2 = tool.image_to_string(image_obj2) req = 'C.d+d' txt2_real = re.findall(req, txt2)[0]
最后將兩個字符串和 & 拼接為長字符串,然后通過 os.rename() 完成重命名文件的目的:
file_name = txt1_real + '&' + txt2_real
os.rename(path + r'文件 (1).pdf', path + r'{}.pdf'.format(file_name))
至此我們就完成了需求的一大步,接下來只需要借助 glob 模塊遍歷目標(biāo)文件夾,對獲取的每一個文件執(zhí)行上面的操作即可,這樣就將全部需求完成,所有的PDF均按照指定字段進(jìn)行重命名
本文的分享就到這里,上面的 Python辦公自動化 案例可以擴(kuò)展到很多使用場景(核心為提取PDF指定內(nèi)容+批量重命名),大家可以自己找一些文件測試學(xué)習(xí),如果對你有所幫助可以給本文來一波三連~
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學(xué)領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學(xué)計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學(xué)計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10