亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、Python處理Excel

  • Python處理Excel的好處

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

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

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

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

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

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

2.openpyxl:若電腦上未安裝office時(shí),也可以使用openpyxl,這個(gè)類型可以運(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的時(shí)候,經(jīng)常會結(jié)合其他類庫,來完成更加復(fù)雜的功能
    • requests, bs4:可以完成爬蟲的功能
    • flask:可以做網(wǎng)頁,把表格展示在網(wǎng)頁上
    • Matplotlib:讀取表格后,進(jìn)行可視化
    • sklearn:進(jìn)行復(fù)雜的數(shù)據(jù)分析時(shí),也可以結(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ā)工具:有兩個(gè)可以選擇,jupyter notebook,是個(gè)網(wǎng)頁編輯器,可以運(yùn)行Python,常常用于交互性、探索性的開發(fā);pycharm,用于成熟腳本,或者web服務(wù)的一些開發(fā);這兩個(gè)工具可以隨意選擇

重要類庫:xlwings, pandas, matplotlib等

二、提取PDF表格到excel

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

先導(dǎo)入PDF讀取模塊`pdfplumber`,隨便挑一頁看下表格數(shù)據(jù)的結(jié)構(gòu)。如下,我們挑了第4頁`pages[3]`來讀取其中的表格,并顯示。這里讀取表格,用到了`extract_tables()`,即默認(rèn)每頁有多個(gè)表格。它會將單個(gè)表格的數(shù)據(jù)按行讀取存入列表,再將每個(gè)表格的所有數(shù)據(jù)匯總存到一個(gè)上一級列表,最后將所有表格的數(shù)據(jù)匯總到一個(gè)大列表。而`extract_table()`方法則只能讀一張表,當(dāng)一個(gè)頁面有多張表,就默認(rèn)選第一個(gè),因此會漏掉后面的。而且它們的數(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)》、《證券時(shí)報(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)錯(cuò),所以加入`if`語句來做個(gè)判斷。只有當(dāng)列表`tables`不為空,即里面有貨的時(shí)候,才建新的Excel表格,并執(zhí)行后續(xù)的寫入操作。列表`tables`若為空(即當(dāng)頁沒有表格),則直接跳到下一頁。

當(dāng)發(fā)現(xiàn)當(dāng)頁有表格后,新建一個(gè)Excel表,以“Sheet”加上此時(shí)PDF的頁碼(比如“Sheet3”)命名。在寫入數(shù)據(jù)時(shí),先用一個(gè)`for`循環(huán)獲得單個(gè)表格的數(shù)據(jù),再用第二個(gè)`for`循環(huán)獲得表格中一行的數(shù)據(jù),然后寫入Excel表。最后保存數(shù)據(jù)。由于表格太多,程序運(yùn)行時(shí)間較長,大約需要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ù)百個(gè)表格就這樣瀟灑地復(fù)制到Excel表格中了。

如果想要指定某個(gè)表格,在提取數(shù)據(jù)的時(shí)候指定頁碼即可。但如果想批量導(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?使用pip在windows命令行中安裝HDF?reader包的操作方法

    Python?使用pip在windows命令行中安裝HDF?reader包的操作方法

    HDF reader包是一個(gè)常用來將.mat類型數(shù)據(jù)導(dǎo)入到python在這里插入代碼片中使用的包,非常好用,今天介紹一下,如何在命令行中安裝這個(gè)包,需要的朋友可以參考下
    2022-12-12
  • 基于Django用戶認(rèn)證系統(tǒng)詳解

    基于Django用戶認(rèn)證系統(tǒng)詳解

    下面小編就為大家分享一篇基于Django用戶認(rèn)證系統(tǒng)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Python使用PyQt5/PySide2編寫一個(gè)極簡的音樂播放器功能

    Python使用PyQt5/PySide2編寫一個(gè)極簡的音樂播放器功能

    這篇文章主要介紹了Python中使用PyQt5/PySide2編寫一個(gè)極簡的音樂播放器功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python中for循環(huán)把字符串或者字典添加到列表的方法

    python中for循環(huán)把字符串或者字典添加到列表的方法

    今天小編就為大家分享一篇python中for循環(huán)把字符串或者字典添加到列表的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python天氣語音播報(bào)小助手

    Python天氣語音播報(bào)小助手

    馬上就要迎來國慶小長假了,激不激動(dòng),興不興奮!那今年國慶:天氣怎么樣?能不能出門逛街?能不能出去旅游?旅游出門就要挑個(gè)好的天氣!下雨天哪兒哪兒都不舒服。今天小編帶大家寫一款Python天氣語音播報(bào)小助手
    2021-09-09
  • Pandas高級教程之Pandas中的GroupBy操作

    Pandas高級教程之Pandas中的GroupBy操作

    通常來說groupby操作可以分為三部分:分割數(shù)據(jù),應(yīng)用變換和和合并數(shù)據(jù),本文將會詳細(xì)講解Pandas中的groupby操作,感興趣的朋友一起看看吧
    2021-07-07
  • 在Python中執(zhí)行系統(tǒng)命令的方法示例詳解

    在Python中執(zhí)行系統(tǒng)命令的方法示例詳解

    最近在做那個(gè)測試框架的時(shí)候發(fā)現(xiàn)對python執(zhí)行系統(tǒng)命令不太熟悉,所以想著總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于在Python中執(zhí)行系統(tǒng)命令的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • python爬蟲之自制英漢字典

    python爬蟲之自制英漢字典

    這篇文章主要為大家詳細(xì)介紹了python爬蟲之自制英漢字典的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Python 實(shí)用技巧之利用Shell通配符做字符串匹配

    Python 實(shí)用技巧之利用Shell通配符做字符串匹配

    這篇文章主要介紹了Python 實(shí)用技巧之利用Shell通配符做字符串匹配的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 機(jī)器學(xué)習(xí)經(jīng)典算法-logistic回歸代碼詳解

    機(jī)器學(xué)習(xí)經(jīng)典算法-logistic回歸代碼詳解

    這篇文章主要介紹了機(jī)器學(xué)習(xí)經(jīng)典算法-logistic回歸代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評論