python中提取幾列_Python一鍵提取PDF中的表格到Excel(實例50)

425fab78778b004b4b485200eb5879e4.gif

從PDF文件獲取表格中的數據,也是日常辦公容易涉及到的一項工作。一個一個復制吧,效率確實太低了。用Python從PDF文檔中提取表格數據,并寫入Excel文件,灰常灰常高效282d4fedf291fcea5761672d284649d2.pngb2eb63cb084bc6b91cb59fedc8511e3a.png

上市公司的年報往往包含幾百張表格,用它作為例子再合適不過,搞定這個,其他含表格的PDF都是小兒科了。今天以"保利地產年報"為例,這個PDF文檔中有321頁含有表格,總表格數超過這個數了。?先導入PDF讀取模塊pdfplumber,隨便挑一頁看下表格數據的結構。如下,我們挑了第4頁pages[3]來讀取其中的表格,并顯示。這里讀取表格,用到了extract_tables(),即默認每頁有多個表格。它會將單個表格的數據按行讀取存入列表,再將每個表格的所有數據匯總存到一個上一級列表,最后將所有表格的數據匯總到一個大列表。而extract_table()方法則只能讀一張表,當一個頁面有多張表,就默認選第一個,因此會漏掉后面的。而且它們的數據結構也不同,差異如下。

5c73fb4a89eb5c7d9fbff6a2117e6379.png

“保利地產年報”第四頁如圖所示,讀取的結果存到列表table,顯示如下。

d700432c0569198a812814950790536d.png

#觀察讀取出來的表格的數據結構
import?pdfplumber
with?pdfplumber.open("保利地產年報.pdf")?as?p:
????page?=?p.pages[3]?#選取第4頁(起始頁為0)
????table?=?page.extract_tables()?#多表格讀取,存為嵌套列表
????print(table)
[[['',?'常用詞語釋義',?None,?None,?None,?None,?None,?''],?['中國證監會',?None,?'',?'指',?'',?'',?'中國證券監督管理委員會',?''],?['國資委',?None,?'',?'指',?'',?'',?'國務院國有資產監督管理委員會',?''],?['上交所',?None,?'',?'指',?'',?'上海證券交易所',?None,?None],?['公司、本公司、保利地產',?None,?'指',?None,?None,?'保利發展控股集團股份有限公司,原名稱保利房\n地產(集團)股份有限公司',?None,?None],?['報告期、本報告期',?None,?'',?'指',?'',?'2018年度',?None,?None],?['元、萬元、億元',?None,?'',?'指',?'',?'人民幣元、人民幣萬元、人民幣億元',?None,?None]],?[['公司的中文名稱',?'保利發展控股集團股份有限公司'],?['公司的中文簡稱',?'保利地產'],?['公司的外文名稱',?'Poly?Developments?and?Holdings?Group?Co.,?Ltd.'],?['公司的外文名稱縮寫',?'PDH'],?['公司的法定代表人',?'宋廣菊']],?[['',?'董事會秘書',?'證券事務代表'],?['姓名',?'黃海',?'尹超'],?['聯系地址',?'廣東省廣州市海珠區閱江中路688號保利國際廣場北塔33層董事會辦公室',?None],?['電話',?'020-89898833',?None],?['傳真',?'020-89898666-8831',?None],?['電子信箱',?'stock@polycn.com',?None]],?[['公司注冊地址',?'廣州市海珠區閱江中路688號保利國際廣場30-33層'],?['公司注冊地址的郵政編碼',?'510308'],?['公司辦公地址',?'廣州市海珠區閱江中路688號保利國際廣場北塔30-33層'],?['公司辦公地址的郵政編碼',?'510308'],?['公司網址',?'www.polycn.com;www.gzpoly.com'],?['電子信箱',?'stock@polycn.com']],?[['公司選定的信息披露媒體名稱',?'《中國證券報》、《上海證券報》、《證券時報》'],?['登載年度報告的中國證監會指定網站的網址',?'www.sse.com.cn'],?['公司年度報告備置地點',?'公司董事會辦公室']]]

54da7d21b2b851564dbe63cdf5c4f2d5.png

確保可正常讀取表格,以及了解讀取出來的表格的數據結構,下面就可以一次性讀取出所有表格,并存入Excel文件中了。導入相應模塊,然后使用pdfplumber打開PDF文件。使用Workbook()新建Excel工作簿,然后使用remove()將其自帶的工作表刪除。因為我們想用PDF文件中表格所在的頁碼給相應的Excel工作表命名,以便二者的編號一致,方便后續查詢。所以需要使用enumerate()給PDF的頁從1開始編號。然后使用extract_tables()獲取表格數據。?當然,如果當頁沒有表格,則extract_tables()獲得的是空值None。在后續的操作中,空值會報錯,所以加入if語句來做個判斷。只有當列表tables不為空,即里面有貨的時候,才建新的Excel表格,并執行后續的寫入操作。列表tables若為空(即當頁沒有表格),則直接跳到下一頁。?當發現當頁有表格后,新建一個Excel表,以“Sheet”加上此時PDF的頁碼(比如“Sheet3”)命名。在寫入數據時,先用一個for循環獲得單個表格的數據,再用第二個for循環獲得表格中一行的數據,然后寫入Excel表。最后保存數據。由于表格太多,程序運行時間較長,大約需要3分鐘。

import?pdfplumber
from?openpyxl?import?Workbook????
with?pdfplumber.open("保利地產年報.pdf")?as?p:
????wb?=?Workbook()?#新建excel工作簿
????wb.remove(wb.worksheets[0])#刪除工作簿自帶的工作表
????for?index,page?in?enumerate(p.pages,start?=?1):?#從1開始給所有頁編號
????????tables?=?page.extract_tables()?#讀取表格
????????if?tables:?#判斷是否存在表格,若不存在,則不執行下面的語句
????????????ws?=?wb.create_sheet(f"Sheet{index}")?#新建工作表,表名的編號與表在PDF中的頁碼一致
????????????for?table?in?tables:?#遍歷所有列表
????????????????for?row?in?table:?#遍歷列表中的所有子列表,里面保存著行數據
????????????????????ws.append(row)?#寫入excel表
????wb.save("保利地產年報表格.xlsx")

數百個表格就這樣瀟灑地復制到Excel表格中了83c1709f918252906bc1e9f62ed72bb6.png

155f0a42f39e3716bc62d003db38b445.png

如果想要指定某個表格,在提取數據的時候指定頁碼即可。但如果想批量導出大量不同公司的年報的指定表格,則需要使用關鍵詞定位了。還好,無論深圳市場還是上海市場,公司的年報中的標題基本都是唯一的,這給我們用標題做關鍵詞提供了方便。假設我們需要提取公司“主要會計數據”下面的表格,則用關鍵詞“主要會計數據”定位即可。如下以此為例進行操作。

import?os
import?pdfplumber
from?openpyxl?import?Workbook????

path='PDF'??#文件所在文件夾
files?=?[path+"\\"+i?for?i?in?os.listdir(path)]?#獲取文件夾下的文件名,并拼接完整路徑
key_words?=?"主要會計數據"

for?file?in?files:
????with?pdfplumber.open(file)?as?p:
????????wb?=?Workbook()?#新建excel工作簿
????????wb.remove(wb.worksheets[0])#刪除工作簿自帶的工作表

????????#獲取關鍵詞所在頁及下一頁的頁碼
????????pages_wanted?=?[]
????????for?index,page?in?enumerate(p.pages):?#從0開始給所有頁編號
????????????if?key_words?in?page.extract_text():
????????????????pages_wanted.append(index)
????????????????pages_wanted.append(index+1)
????????????????break

????????#提取指定頁碼里的表格
????????for?i?in?pages_wanted:?????
????????????page?=?p.pages[i]
????????????tables?=?page.extract_tables()?#讀取表格
????????????if?tables:?#判斷是否存在表格,若不存在,則不執行下面的語句
????????????????ws?=?wb.create_sheet(f"Sheet{i+1}")?#新建工作表,表名的編號與表在PDF中的頁碼一致
????????????????for?table?in?tables:?#遍歷所有列表
????????????????????for?row?in?table:?#遍歷列表中的所有子列表,里面保存著行數據
????????????????????????ws.append(row)?#寫入excel表
????????wb.save("Excel\\{}.xlsx".format(file.split("\\")[1].split(".")[0]))

以上,增加了一段獲取關鍵詞所在頁碼及下一頁的頁碼的程序。之所以要獲取關鍵詞下一頁頁碼,是因為有些表格會跨頁,為了不遺漏數據,寧愿多獲取一點。一旦找到關鍵詞所在頁,馬上用break停止for循環。后面再遍歷pages_wanted里面儲存的頁碼,提取表格并寫入Excel文件,并保存即可。批量獲取的指定內容保存在Excel文件夾下。

3cda0eee4ff2394c7a4550fea2736ba9.png

如果您有需要處理的問題,可發郵件到我郵箱:donyo@qq.com,一起探討解決方案。微信公眾號輸入“源文件”提取所有源文件及資料。

ed3f89c04833b5887e929d4c3983f400.png

最好的贊賞就是點亮下方“在看”,多給PythonOffice積攢一點人氣哈!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532415.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EM算法公式推導

EM算法公式推導 EM 算法是一種用來進行含有隱變量的概率生成模型參數估計的迭代算法。 EM算法步驟 EM 算法通過迭代求 L(θ)log?P(X∣θ)L(\theta)\log P(X|\theta)L(θ)logP(X∣θ) 的極大似然估計,每次迭代包含兩部:E步,求期望&#xf…

詳解最大似然估計(MLE)、最大后驗概率估計(MAP),以及貝葉斯公式的理解

詳解最大似然估計(MLE)、最大后驗概率估計(MAP),以及貝葉斯公式的理解 聲明:本文為原創文章,發表于nebulaf91的csdn博客。歡迎轉載,但請務必保留本信息,注明文章出處。 本…

elemntui icon 大小_自定義elementui中的圖標

前提elementui圖標庫圖標較少當你想用elementui的控件而不想用它的圖標時,就可以使用自定義的方式來實現實現el-icon-my-export為我自定義的圖標命名導出//使用圖片來替換//before屬性中的content文本是用來占位的,必須有//可以設置字體大小來確定大小//使用visibil…

變分推斷公式推導

變分推斷公式推導 背景介紹 機器學習中的概率模型可分為頻率派和貝葉斯派。頻率派最終是求一個優化問題,而貝葉斯派則是求一個積分問題。 頻率派 舉幾個例子: 線性回歸 樣本數據:{(xi,yi)}i1N\{(x_i,y_i)\}_{i1}^N{(xi?,yi?)}i1N? 模…

重新打開_iPhone 應用停止響應或無法打開的解決辦法

如果當您在 iPhone 上使用某個重要應用時,遇到應用停止響應、意外退出或無法打開的問題,請參考如下步驟嘗試解決:1.強制退出應用:在 iPhone 后臺強制關閉該應用之后,再次重新打開看看。2.重啟您的設備,然后…

機器學習理論——優雅的模型:變分自編碼器(VAE)

機器學習理論——優雅的模型:變分自編碼器(VAE) 轉自:機器學習理論—優雅的模型(一):變分自編碼器(VAE) 另外直觀理解 VAE, 推薦 臺大李宏毅老師的課程&#…

grub引導項修復詳解_重新安裝win7后,修復Grub啟動項

重新安裝win7后,修復Grub啟動項發布時間:2010-09-14 22:14:00來源:紅聯作者:null925[is] 本帖最后由 null925 于 2010-9-14 22:18 編輯 [/i]原先使用Win7,Gentoo,Ubuntu三系統,Grub作為系統引導管理器,今天重新安裝Win…

基于流的(Flow-based)生成模型簡介

基于流的(Flow-based)生成模型簡介 生成任務 我們先回顧一下所謂的生成任務,究竟是做什么事情。我們認為,世界上所有的圖片,是符合某種分布 pdata(x)p_{data}(x)pdata?(x) 的。當然,這個分布肯定是個極其復雜的分布。而我們有一…

iec60870-5-104通訊協議編程_三菱FX編程口通訊協議1——協議解讀

三菱PLC編程口通訊協議:1、三菱PLC編程口通訊協議有四個命令,如下:2、三菱FX系列PLC地址對應表:PLC_X Group Base AddRess128;Const PLC_Y_Group Base AddRess160;M _Group Base_AddRess 256;P…

采用ODP.NET 批量進行數據同步

因開發、測試場景經常需要模擬機生產環境的數據,原同事開發了一個ado.net圖形化同步工具,對非技術人員操作友好,但對技術員使用并不方便,每次同步需源庫數據與目標的數據源字段進行配置,且同步大數據時慢,因…

熔斷器熔斷時間標準_一種熔斷器熔斷時間測試電路的制作方法

本實用新型涉及汽車制造技術領域,尤其涉及一種熔斷器熔斷時間測試電路。背景技術:伴隨著日新月異的科技進步,人們對生活質量的追求也越來越高,汽車已經成為人們日常出行必不可少的交通工具,人們對汽車的舒適性、安全性…

DETR精讀筆記

DETR精讀筆記 論文:End-to-End Object Detection with Transformers (發表于 ECCV-2020) 代碼:https://github.com/facebookresearch/detr 解讀視頻:DETR 論文精讀【論文精讀】 本筆記主要基于 Yi Zhu 老師的解讀 引言…

lcd像素點密度_【教程】設置添加LCD密度(DPI)設置

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓完美—————————————————分割————————————————————————反編譯settings.apk(1.52)1.Settings.apk\res\values\arrays.xml在之前加入以下代碼240242244246248250252254256258260262264266268…

GAN網絡評估指標:IS、FID、PPL

GAN網絡評估指標:IS、FID、PPL 轉自:IS、FID、PPL,GAN網絡評估指標 另外關于GAN的評價指標,推薦李宏毅老師的視頻:【機器學習2021】生成式對抗網路 (Generative Adversarial Network, GAN) (三) – 生成器效能評估與條…

降維后輸入分類器分類時報錯_邏輯回歸解決多分類方法及其優缺點分析

眾所周知,邏輯回歸常用于解決二分類任務,但是在工作/學習/項目中,我們也經常要解決多分類問題。本文總結了 3 種邏輯回歸解決多分類的方法,并分析了他們的優缺點。一、One-Vs-Rest假設我們要解決一個分類問題,該分類問…

淺談 PyTorch 中的 tensor 及使用

淺談 PyTorch 中的 tensor 及使用 轉自:淺談 PyTorch 中的 tensor 及使用 這篇文章主要是圍繞 PyTorch 中的 tensor 展開的,討論了張量的求導機制,在不同設備之間的轉換,神經網絡中權重的更新等內容。面向的讀者是使用過 PyTorch …

簡述springmvc過程_spring mvc的工作流程是什么?

展開全部SpringMVC工作流程描述向服務器發送HTTP請求,請求被前端控制器 DispatcherServlet 捕獲。DispatcherServlet 根據 -servlet.xml 中的配置對請62616964757a686964616fe59b9ee7ad9431333365646233求的URL進行解析,得到請求資源標識符(URI)。 然后根…

PyTorch 的 Autograd

PyTorch 的 Autograd 轉自:PyTorch 的 Autograd PyTorch 作為一個深度學習平臺,在深度學習任務中比 NumPy 這個科學計算庫強在哪里呢?我覺得一是 PyTorch 提供了自動求導機制,二是對 GPU 的支持。由此可見,自動求導 (a…

商場樓層導視牌圖片_百寶圖商場電子導視軟件中預約產品功能簡介

百寶圖商場電子導視軟件中預約產品功能簡介 管理端,可配合百寶圖商場電子導視軟件配套使用 1:數據展示:圖形展示總預約數/預約時間峰值/預約途徑/各途徑數量對比 2:數據統計:有效預約數量/無效預約數量/無效預約原因備…

Pytorch autograd.grad與autograd.backward詳解

Pytorch autograd.grad與autograd.backward詳解 引言 平時在寫 Pytorch 訓練腳本時,都是下面這種無腦按步驟走: outputs model(inputs) # 模型前向推理 optimizer.zero_grad() # 清除累積梯度 loss.backward() # 模型反向求導 optimizer.step()…