最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python一鍵提取PDF中的表格到Excel的方法詳解

 更新時間:2023年08月07日 11:24:28   作者:艾派森  
從PDF文件獲取表格中的數(shù)據(jù),也是日常辦公容易涉及到的一項(xiàng)工作,一個一個復(fù)制吧,效率確實(shí)太低了,用Python從PDF文檔中提取表格數(shù)據(jù),并寫入Excel文件,灰?;页8咝?本文就給大家介紹一下如何使用Python一鍵提取PDF中的表格到Excel,需要的朋友可以參考下

一、Python處理Excel

  • Python處理Excel的好處

1.批量操作:當(dāng)要處理眾多Excel文件時,例如出現(xiàn)重復(fù)性的手工勞動,那么使用Python就可以實(shí)現(xiàn)批量掃描文件、自動化進(jìn)行處理,利用代碼代替手工重復(fù)勞動,實(shí)現(xiàn)自動化,是Python第一個比Excel強(qiáng)大的地方

2.大型文件,當(dāng)Excel文件超過幾十兆、甚至上百兆時,打開文件很慢、處理文件更加慢,這時候若使用Python,會發(fā)現(xiàn)處理幾十兆、幾百兆甚至幾GB都是沒有問題的

3.當(dāng)使用Excel進(jìn)行復(fù)雜的計(jì)算時,會使用VBA,但是VBA本身是過時并且復(fù)雜的語言,Python是當(dāng)前最簡單且容易實(shí)現(xiàn)的一門語言,用Python能夠處理比VBA難度更高的業(yè)務(wù)邏輯

4.Python是通用語言,不僅可以處理Excel,使用Python就可以得到很多額外的功能,例如:爬蟲、發(fā)布網(wǎng)頁的Web服務(wù)、與數(shù)據(jù)庫進(jìn)行連接、同時結(jié)合word和PPT進(jìn)行處理、加入定時任務(wù)處理、人工智能分析等,各種額外的功能,這是Excel和VBA所不具備的

  • Python處理Excel主要有三大類庫

1.pandas:是Python領(lǐng)域非常重要的,用于數(shù)據(jù)分析和可視化的類庫,在處理Excel中,90%可以利用pandas類庫就可以搞掂,利用pandas就可以讀取Excel、處理Excel和輸出Excel,但是pandas也有缺點(diǎn),就是無法做到格式類,例如Excel中合并單元、大量復(fù)雜的樣式(看起來很精美)的時候,用pandas無法搞掂,此時,依然是使用pandas結(jié)合openyxl、xlwings來搞掂需求

2.openpyxl:若電腦上未安裝office時,也可以使用openpyxl,這個類型可以運(yùn)行在linux上,并且也可以實(shí)現(xiàn)操作大部分Excel格式和樣式的功能,使用它配合pandas,也可以完成大部分場景的需求

3.xlwings:比openyxl更加強(qiáng)大,只能運(yùn)行在Windows或者M(jìn)ac系統(tǒng),并且該系統(tǒng)中必須安裝了office才能運(yùn)行,xlwings的原理,就是基于當(dāng)前系統(tǒng)已經(jīng)安裝好的office軟件,來進(jìn)行功能的拓展來操作Excel

  • 使用pandas的時候,經(jīng)常會結(jié)合其他類庫,來完成更加復(fù)雜的功能
    • requests, bs4:可以完成爬蟲的功能
    • flask:可以做網(wǎng)頁,把表格展示在網(wǎng)頁上
    • Matplotlib:讀取表格后,進(jìn)行可視化
    • sklearn:進(jìn)行復(fù)雜的數(shù)據(jù)分析時,也可以結(jié)合機(jī)器學(xué)習(xí)Sklearn把讀取的Excel數(shù)據(jù),進(jìn)行數(shù)據(jù)分析和機(jī)器學(xué)習(xí)
    • Python-docx:也可以結(jié)合Python-docx類庫,實(shí)現(xiàn)Excel和word的互通
    • smtplib:也可以使用smtplib,講Excel數(shù)據(jù)發(fā)送郵件出去
  • 開發(fā)環(huán)境

操作系統(tǒng):使用windows, mac都可以

Python版本:系統(tǒng)中需要安裝Python3.6以上的版本,Python2已經(jīng)過期不建議使用,Python3.6以前的版本功能相對弱,最好就是采用Python3.6以上的版本

開發(fā)工具:有兩個可以選擇,jupyter notebook,是個網(wǎng)頁編輯器,可以運(yùn)行Python,常常用于交互性、探索性的開發(fā);pycharm,用于成熟腳本,或者web服務(wù)的一些開發(fā);這兩個工具可以隨意選擇

重要類庫:xlwings, pandas, matplotlib等

二、提取PDF表格到excel

從PDF文件獲取表格中的數(shù)據(jù),也是日常辦公容易涉及到的一項(xiàng)工作。一個一個復(fù)制吧,效率確實(shí)太低了。用Python從PDF文檔中提取表格數(shù)據(jù),并寫入Excel文件,灰?;页8咝АI鲜泄镜哪陥?bào)往往包含幾百張表格,用它作為例子再合適不過,搞定這個,其他含表格的PDF都是小兒科了。今天以"保利地產(chǎn)年報(bào)"為例,這個PDF文檔中有321頁含有表格,總表格數(shù)超過這個數(shù)了。

先導(dǎo)入PDF讀取模塊`pdfplumber`,隨便挑一頁看下表格數(shù)據(jù)的結(jié)構(gòu)。如下,我們挑了第4頁`pages[3]`來讀取其中的表格,并顯示。這里讀取表格,用到了`extract_tables()`,即默認(rèn)每頁有多個表格。它會將單個表格的數(shù)據(jù)按行讀取存入列表,再將每個表格的所有數(shù)據(jù)匯總存到一個上一級列表,最后將所有表格的數(shù)據(jù)匯總到一個大列表。而`extract_table()`方法則只能讀一張表,當(dāng)一個頁面有多張表,就默認(rèn)選第一個,因此會漏掉后面的。而且它們的數(shù)據(jù)結(jié)構(gòu)也不同,差異如下。 

“保利地產(chǎn)年報(bào)”第四頁如圖所示,讀取的結(jié)果存到列表`table`,顯示如下:

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

確??烧Wx取表格,以及了解讀取出來的表格的數(shù)據(jù)結(jié)構(gòu),下面就可以一次性讀取出所有表格,并存入Excel文件中了。導(dǎo)入相應(yīng)模塊,然后使用`pdfplumber`打開PDF文件。使用`Workbook()`新建Excel工作簿,然后使用`remove()`將其自帶的工作表刪除。因?yàn)槲覀兿胗肞DF文件中表格所在的頁碼給相應(yīng)的Excel工作表命名,以便二者的編號一致,方便后續(xù)查詢。所以需要使用`enumerate()`給PDF的頁從1開始編號。然后使用`extract_tables()`獲取表格數(shù)據(jù)。

當(dāng)然,如果當(dāng)頁沒有表格,則`extract_tables()`獲得的是空值`None`。在后續(xù)的操作中,空值會報(bào)錯,所以加入`if`語句來做個判斷。只有當(dāng)列表`tables`不為空,即里面有貨的時候,才建新的Excel表格,并執(zhí)行后續(xù)的寫入操作。列表`tables`若為空(即當(dāng)頁沒有表格),則直接跳到下一頁。

當(dāng)發(fā)現(xiàn)當(dāng)頁有表格后,新建一個Excel表,以“Sheet”加上此時PDF的頁碼(比如“Sheet3”)命名。在寫入數(shù)據(jù)時,先用一個`for`循環(huán)獲得單個表格的數(shù)據(jù),再用第二個`for`循環(huán)獲得表格中一行的數(shù)據(jù),然后寫入Excel表。最后保存數(shù)據(jù)。由于表格太多,程序運(yùn)行時間較長,大約需要3分鐘。

import pdfplumber
from openpyxl import Workbook    
with pdfplumber.open("保利地產(chǎn)年報(bào).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: #判斷是否存在表格,若不存在,則不執(zhí)行下面的語句
            ws = wb.create_sheet(f"Sheet{index}") #新建工作表,表名的編號與表在PDF中的頁碼一致
            for table in tables: #遍歷所有列表
                for row in table: #遍歷列表中的所有子列表,里面保存著行數(shù)據(jù)
                    ws.append(row) #寫入excel表
    wb.save("保利地產(chǎn)年報(bào)表格.xlsx")

數(shù)百個表格就這樣瀟灑地復(fù)制到Excel表格中了。

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

import os
import pdfplumber
from openpyxl import Workbook    
path='PDF'  #文件所在文件夾
files = [path+"\\"+i for i in os.listdir(path)] #獲取文件夾下的文件名,并拼接完整路徑
key_words = "主要會計(jì)數(shù)據(jù)"
for file in files:
    with pdfplumber.open(file) as p:
        wb = Workbook() #新建excel工作簿
        wb.remove(wb.worksheets[0])#刪除工作簿自帶的工作表
        #獲取關(guān)鍵詞所在頁及下一頁的頁碼
        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: #判斷是否存在表格,若不存在,則不執(zhí)行下面的語句
                ws = wb.create_sheet(f"Sheet{i+1}") #新建工作表,表名的編號與表在PDF中的頁碼一致
                for table in tables: #遍歷所有列表
                    for row in table: #遍歷列表中的所有子列表,里面保存著行數(shù)據(jù)
                        ws.append(row) #寫入excel表
        wb.save("Excel\\{}.xlsx".format(file.split("\\")[1].split(".")[0]))

以上,增加了一段獲取關(guān)鍵詞所在頁碼及下一頁的頁碼的程序。之所以要獲取關(guān)鍵詞下一頁頁碼,是因?yàn)橛行┍砀駮珥?,為了不遺漏數(shù)據(jù),寧愿多獲取一點(diǎn)。一旦找到關(guān)鍵詞所在頁,馬上用`break`停止`for`循環(huán)。后面再遍歷`pages_wanted`里面儲存的頁碼,提取表格并寫入Excel文件,并保存即可。批量獲取的指定內(nèi)容保存在`Excel`文件夾下。

以上就是使用Python一鍵提取PDF中的表格到Excel的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python提取PDF表格到Excel的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python 操作文件的基本方法總結(jié)

    Python 操作文件的基本方法總結(jié)

    這篇文章主要介紹了Python 操作文件的基本方法總結(jié)的相關(guān)資料,這里說明了九種操作文件的方法,并附上實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-08-08
  • Python處理日期方法詳細(xì)大全(30種方法)

    Python處理日期方法詳細(xì)大全(30種方法)

    這篇文章主要給大家介紹了關(guān)于Python處理日期方法詳細(xì)大全,文中共介紹了30種方法,Python程序能用很多方式處理日期和時間,轉(zhuǎn)換日期格式是一個常見的功能,Python提供了一個time和calendar模塊可以用于格式化日期和時間,需要的朋友可以參考下
    2023-12-12
  • Python如何在一個類里面調(diào)用另一個類里面的內(nèi)容

    Python如何在一個類里面調(diào)用另一個類里面的內(nèi)容

    Python 是一門強(qiáng)大且靈活的編程語言,然而我們經(jīng)常會遇到這樣一個問題:如何在一個類里面調(diào)用另一個類里面的東西,下面我們就來看看幾種實(shí)現(xiàn)方法吧
    2025-09-09
  • pytorch之torch_scatter.scatter_max()用法

    pytorch之torch_scatter.scatter_max()用法

    這篇文章主要介紹了pytorch之torch_scatter.scatter_max()用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python延遲綁定問題原理及解決方案

    Python延遲綁定問題原理及解決方案

    這篇文章主要介紹了Python延遲綁定問題原理及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Jupyter加載文件的實(shí)現(xiàn)方法

    Jupyter加載文件的實(shí)現(xiàn)方法

    這篇文章主要介紹了Jupyter加載文件的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python讀取二進(jìn)制文件代碼方法解析

    Python讀取二進(jìn)制文件代碼方法解析

    這篇文章主要介紹了Python讀取二進(jìn)制文件代碼方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • 深入解析Python中的變量和賦值運(yùn)算符

    深入解析Python中的變量和賦值運(yùn)算符

    這篇文章主要介紹了深入解析Python中的變量和賦值運(yùn)算符,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 使用Python對mongo數(shù)據(jù)庫中字符串型正負(fù)數(shù)值比較大小

    使用Python對mongo數(shù)據(jù)庫中字符串型正負(fù)數(shù)值比較大小

    這篇文章主要介紹了使用Python對mongo數(shù)據(jù)庫中字符串型正負(fù)數(shù)值比較大小,
    2023-04-04
  • Python3中的多行輸入問題

    Python3中的多行輸入問題

    這篇文章主要介紹了Python3中的多行輸入問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論

辛集市| 盘锦市| 勐海县| 政和县| 广州市| 保康县| 佳木斯市| 老河口市| 河南省| 宁阳县| 鸡东县| 天峨县| 桃园县| 砀山县| 康平县| 耿马| 平南县| 梁山县| 中宁县| 滦平县| 兴文县| 来宾市| 历史| 潞西市| 仁寿县| 旺苍县| 永和县| 宝丰县| 乌苏市| 修武县| 古浪县| 社旗县| 金阳县| 克拉玛依市| 乌鲁木齐市| 沂水县| 阳江市| 科技| 长宁县| 长春市| 繁昌县|