?
???♂? 個(gè)人主頁:@艾派森的個(gè)人主頁
???作者簡(jiǎn)介:Python學(xué)習(xí)者
?? 希望大家多多支持,我們一起進(jìn)步!??
如果文章對(duì)你有幫助的話,
歡迎評(píng)論 ??點(diǎn)贊???? 收藏 ??加關(guān)注+
目錄
一、Python處理Excel
二、提取PDF表格到excel
三、往期推薦
文末推薦?
文末福利
?文章來源地址http://www.zghlxwxcb.cn/news/detail-635066.html
一、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,會(huì)發(fā)現(xiàn)處理幾十兆、幾百兆甚至幾GB都是沒有問題的
3.當(dāng)使用Excel進(jìn)行復(fù)雜的計(jì)算時(shí),會(huì)使用VBA,但是VBA本身是過時(shí)并且復(fù)雜的語言,Python是當(dāng)前最簡(jiǎn)單且容易實(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,也可以完成大部分場(chǎng)景的需求
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)常會(huì)結(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以前的版本功能相對(duì)弱,最好就是采用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è)表格。它會(huì)將單個(gè)表格的數(shù)據(jù)按行讀取存入列表,再將每個(gè)表格的所有數(shù)據(jù)匯總存到一個(gè)上一級(jí)列表,最后將所有表格的數(shù)據(jù)匯總到一個(gè)大列表。而`extract_table()`方法則只能讀一張表,當(dāng)一個(gè)頁面有多張表,就默認(rèn)選第一個(gè),因此會(huì)漏掉后面的。而且它們的數(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)會(huì)', None, '', '指', '', '', '中國證券監(jiān)督管理委員會(huì)', ''], ['國資委', None, '', '指', '', '', '國務(wù)院國有資產(chǎn)監(jiān)督管理委員會(huì)', ''], ['上交所', 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)股份有限公司'], ['公司的中文簡(jiǎn)稱', '保利地產(chǎn)'], ['公司的外文名稱', 'Poly Developments and Holdings Group Co., Ltd.'], ['公司的外文名稱縮寫', 'PDH'], ['公司的法定代表人', '宋廣菊']], [['', '董事會(huì)秘書', '證券事務(wù)代表'], ['姓名', '黃海', '尹超'], ['聯(lián)系地址', '廣東省廣州市海珠區(qū)閱江中路688號(hào)保利國際廣場(chǎng)北塔33層董事會(huì)辦公室', None], ['電話', '020-89898833', None], ['傳真', '020-89898666-8831', None], ['電子信箱', 'stock@polycn.com', None]], [['公司注冊(cè)地址', '廣州市海珠區(qū)閱江中路688號(hào)保利國際廣場(chǎng)30-33層'], ['公司注冊(cè)地址的郵政編碼', '510308'], ['公司辦公地址', '廣州市海珠區(qū)閱江中路688號(hào)保利國際廣場(chǎng)北塔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)會(huì)指定網(wǎng)站的網(wǎng)址', 'www.sse.com.cn'], ['公司年度報(bào)告?zhèn)渲玫攸c(diǎn)', '公司董事會(huì)辦公室']]]
????????確??烧Wx取表格,以及了解讀取出來的表格的數(shù)據(jù)結(jié)構(gòu),下面就可以一次性讀取出所有表格,并存入Excel文件中了。導(dǎo)入相應(yīng)模塊,然后使用`pdfplumber`打開PDF文件。使用`Workbook()`新建Excel工作簿,然后使用`remove()`將其自帶的工作表刪除。因?yàn)槲覀兿胗肞DF文件中表格所在的頁碼給相應(yīng)的Excel工作表命名,以便二者的編號(hào)一致,方便后續(xù)查詢。所以需要使用`enumerate()`給PDF的頁從1開始編號(hào)。然后使用`extract_tables()`獲取表格數(shù)據(jù)。
????????當(dāng)然,如果當(dāng)頁沒有表格,則`extract_tables()`獲得的是空值`None`。在后續(xù)的操作中,空值會(huì)報(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開始給所有頁編號(hào)
tables = page.extract_tables() #讀取表格
if tables: #判斷是否存在表格,若不存在,則不執(zhí)行下面的語句
ws = wb.create_sheet(f"Sheet{index}") #新建工作表,表名的編號(hào)與表在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)鍵詞定位了。還好,無論深圳市場(chǎng)還是上海市場(chǎng),公司的年報(bào)中的標(biāo)題基本都是唯一的,這給我們用標(biāo)題做關(guān)鍵詞提供了方便。假設(shè)我們需要提取公司“主要會(huì)計(jì)數(shù)據(jù)”下面的表格,則用關(guān)鍵詞“主要會(huì)計(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 = "主要會(huì)計(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開始給所有頁編號(hào)
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}") #新建工作表,表名的編號(hào)與表在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)橛行┍砀駮?huì)跨頁,為了不遺漏數(shù)據(jù),寧愿多獲取一點(diǎn)。一旦找到關(guān)鍵詞所在頁,馬上用`break`停止`for`循環(huán)。后面再遍歷`pages_wanted`里面儲(chǔ)存的頁碼,提取表格并寫入Excel文件,并保存即可。批量獲取的指定內(nèi)容保存在`Excel`文件夾下。
三、往期推薦
Python提取pdf中的表格數(shù)據(jù)(附實(shí)戰(zhàn)案例)
?使用Python自動(dòng)發(fā)送郵件
Python操作ppt和pdf基礎(chǔ)
Python操作word基礎(chǔ)
Python操作excel基礎(chǔ)
文末推薦???
AI時(shí)代Excel數(shù)據(jù)分析提升之道:知識(shí)精進(jìn)+學(xué)習(xí)答疑+上機(jī)實(shí)訓(xùn)+綜合實(shí)戰(zhàn)+ChatGPT應(yīng)用,零基礎(chǔ)入門,極速提升數(shù)據(jù)分析效率!
內(nèi)容簡(jiǎn)介:
????????本書在理論方面和實(shí)踐方面都講解得淺顯易懂,能夠讓讀者快速上手,一步步學(xué)會(huì)使用Python與Excel相結(jié)合進(jìn)行數(shù)據(jù)處理與分析。
全書內(nèi)容分3個(gè)部分共12章。第1~4章為入門部分,主要介紹什么是數(shù)據(jù)分析,以及Python的編程環(huán)境和基礎(chǔ)語法知識(shí)。第5~9章為進(jìn)階部分,主要介紹數(shù)據(jù)處理和分析的各種方法。第10~12章為實(shí)戰(zhàn)部分,這部分的3個(gè)實(shí)例綜合了本書前面部分的知識(shí)點(diǎn),介紹了如何結(jié)合Python與Excel在實(shí)際工作中進(jìn)行數(shù)據(jù)處理與分析操作。
????????本書內(nèi)容由淺入深,且配有案例的素材文件和代碼文件,便于讀者邊學(xué)邊練。本書還創(chuàng)新性地將ChatGPT引入教學(xué)當(dāng)中,給讀者帶來全新的學(xué)習(xí)方式。本書既適合Python和數(shù)據(jù)分析的初學(xué)者學(xué)習(xí),也適合希望從事數(shù)據(jù)分析相關(guān)行業(yè)的讀者學(xué)習(xí),還可作為廣大職業(yè)院校數(shù)據(jù)分析培訓(xùn)相關(guān)專業(yè)的教材參考用書。
編輯推薦:
(1)零基礎(chǔ)入門寶典,由淺入深講解,無須額外的背景知識(shí)即可學(xué)習(xí)掌握。
(2)內(nèi)容系統(tǒng)全面,可幫助讀者快速了解使用Python進(jìn)行Excel數(shù)據(jù)分析的基本語法并掌握開發(fā)能力。
(3)理論與實(shí)踐相結(jié)合,每個(gè)理論都有對(duì)應(yīng)的代碼示例,讀者參考代碼示例完成編寫,就可以看到實(shí)踐效果。
(4)本書配有實(shí)訓(xùn)與問答,方便讀者閱讀后盡快鞏固知識(shí)點(diǎn),做到舉一反三、學(xué)以致用。
(5)AI前沿產(chǎn)品ChatGPT+Python進(jìn)行Excel數(shù)據(jù)分析,大幅學(xué)習(xí)和分析的效率
文末福利
《碼上行動(dòng)》和《Python自動(dòng)化辦公應(yīng)用大全》二選一免費(fèi)包郵送出5本!
- ?抽獎(jiǎng)方式:評(píng)論區(qū)隨機(jī)抽取5位小伙伴免費(fèi)送出!
- 參與方式:關(guān)注博主、點(diǎn)贊、收藏、評(píng)論區(qū)評(píng)論“人生苦短,拒絕內(nèi)卷!”(切記要點(diǎn)贊+收藏,否則抽獎(jiǎng)無效,每個(gè)人最多評(píng)論三次!)
- 活動(dòng)截止時(shí)間:2023-08-08?20:00:00
《碼上行動(dòng)》京東鏈接:https://item.jd.com/14069538.html
《Python自動(dòng)化大全》京東鏈接:https://item.jd.com/13953308.html
?名單公布時(shí)間:2023-08-08?21:00:00??
文章來源:http://www.zghlxwxcb.cn/news/detail-635066.html
?
到了這里,關(guān)于【辦公自動(dòng)化】使用Python一鍵提取PDF中的表格到Excel的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!