Python讀取pdf表格寫入excel的方法
背景
今天突然想到之前被要求做同性質(zhì)銀行的數(shù)據(jù)分析。媽耶!十幾個(gè)銀行,每個(gè)銀行近5年的財(cái)務(wù)數(shù)據(jù),而且財(cái)務(wù)報(bào)表一般都是 pdf 的,我們將 pdf 中表的數(shù)據(jù)一個(gè)個(gè)的拷貝到 excel 中,再借助 excel 去進(jìn)行求和求平均等聚合函數(shù)操作,完事了還得把求出來(lái)的結(jié)果再統(tǒng)一 CV 到另一張表中,進(jìn)行可視化分析…
當(dāng)然,那時(shí)風(fēng)流倜儻的 老Amy 還熟練的玩轉(zhuǎn)著 excel ,也是個(gè)秀兒~ 今天就思索著,如果當(dāng)年我會(huì) Python 是不是可以讓我成為班級(jí)最靚的崽!用技術(shù)占領(lǐng)高地,HHH,所以今天我來(lái)了,希望可以幫助大家解決同性質(zhì)的問(wèn)題。
開始學(xué)習(xí)叭
避免CV大法
pdf 文件的表格的數(shù)據(jù)可以復(fù)制,但是這是一項(xiàng)非常繁瑣的事情。所以我首先考慮的是,Python 可否幫助我們高效且規(guī)范地讀取 pdf 中的表格數(shù)據(jù)。所以一頓的檢索,發(fā)現(xiàn)了一個(gè)比較優(yōu)質(zhì)處理 pdf 的庫(kù):pdfplumber,當(dāng)然這個(gè)庫(kù)需要大家 pip install pdfplumber 去進(jìn)行安裝。以及詳細(xì)使用可參考全球最大基友社區(qū):https://github.com/jsvine/pdfplumber
步驟:
- 導(dǎo)入 pdfplumber 庫(kù)
- 通過(guò) pdfplumber.open() 函數(shù) 獲取 mt2018.pdf 文件對(duì)象
- 通過(guò)該 對(duì)象.pages 獲取 pdf 每頁(yè)的對(duì)象,截取我們需要的頁(yè)對(duì)象即可
- 通過(guò) 頁(yè)對(duì)象.extract_tables() 獲取表格數(shù)據(jù)(若需要獲取文本:頁(yè)對(duì)象.extract_text())
代碼實(shí)現(xiàn):
import pdfplumber
# 獲取 pdf 文件對(duì)象
pdf_mt = pdfplumber.open("mt2018.pdf")
# 因?yàn)槲倚枰@取的資產(chǎn)負(fù)債表在 51-53頁(yè) 但是索引從0開始 所以切片取 50-52即可
for pdf_pg in pdf_mt.pages[50:53]:
# 只提取當(dāng)前頁(yè)表格數(shù)據(jù)
print(pdf_pg.extract_tables())
--------------------------------------------------------------------------
結(jié)果比較多,截取一部分:
[[['項(xiàng)目', '附注', '期末余額', '期初余額'], ['流動(dòng)資產(chǎn):', '', '', ''], ['貨幣資金', '1', '112,074,791,420.06', '87,868,869,913.34'], ['結(jié)算備付金', '', '', ''], ['拆出資金', '', '', ''], ['以公允價(jià)值計(jì)量且其變動(dòng)計(jì)入當(dāng)\n期損益的金融資產(chǎn)', '', '', ''], ['衍生金融資產(chǎn)', '', '', ''], ['應(yīng)收票據(jù)及應(yīng)收賬款', '2', '563,739,710.00', '1,221,706,039.00']]]
將完整表保存到 csv 文件中
我們發(fā)現(xiàn),返回的數(shù)據(jù)集是一個(gè)三維的列表。那么在我們平時(shí)處理的 excel 表格數(shù)據(jù)(行與列)都是二維的數(shù)據(jù)。那么,這多出的一維是什么呢?其實(shí)就是我們的夜[頁(yè)]~ 再來(lái)一個(gè)循環(huán)取出二維數(shù)據(jù)進(jìn)行保存即可
for pdf_pg in pdf_mt.pages[50:53]:
for pdf_tb in pdf_pg.extract_tables():
print(pdf_tb)
------------------------------------------------------------------------------
結(jié)果比較多,截取一部分:
[['項(xiàng)目', '附注', '期末余額', '期初余額'], ['流動(dòng)資產(chǎn):', '', '', ''], ['貨幣資金', '1', '112,074,791,420.06', '87,868,869,913.34'], ['結(jié)算備付金', '', '', ''], ['拆出資金', '', '', ''], ['以公允價(jià)值計(jì)量且其變動(dòng)計(jì)入當(dāng)\n期損益的金融資產(chǎn)', '', '', ''], ['衍生金融資產(chǎn)', '', '', ''], ['應(yīng)收票據(jù)及應(yīng)收賬款', '2', '563,739,710.00', '1,221,706,039.00']]
但是,真的那么簡(jiǎn)單嗎?這時(shí),我們就需要細(xì)品我們的 pdf 了,如下圖

我們發(fā)現(xiàn),一張完整的資產(chǎn)負(fù)債表分布在多頁(yè)上。也就是說(shuō),每一頁(yè)的里面的表格數(shù)據(jù)都是一個(gè)三維的列表,所以我們保存數(shù)據(jù)的時(shí)候,需要讓其有共同的表頭(列索引),并且進(jìn)行拼接。
那必須就要強(qiáng)推我們的 pandas 了,pandas.DataFrame() 非常完美的創(chuàng)建表格式的二維數(shù)組,以及指定列索引(表頭)。包括可以直接 使用 df.append() 進(jìn)行共同表頭數(shù)據(jù)的堆疊拼接。
import pdfplumber
import pandas as pd
import numpy as np
# 創(chuàng)建僅有表頭的 dataframe 數(shù)組
pdf_df = pd.DataFrame(columns=['項(xiàng)目', '附注', '期末余額', '期初余額'])
# 獲取 pdf 文件對(duì)象
pdf_mt = pdfplumber.open("mt2018.pdf")
# 因?yàn)槲倚枰@取的資產(chǎn)負(fù)債表在 51-53頁(yè) 但是索引從0開始 所以切片取 50-52即可
for pdf_pg in pdf_mt.pages[50:53]:
# 獲取二維列表
for pdf_tb in pdf_pg.extract_tables():
# 將其拼接
pdf_df = pdf_df.append(pd.DataFrame(np.array(pdf_tb),columns=['項(xiàng)目', '附注', '期末余額', '期初余額']))
# 顯示后五條
pdf_df.tail()
dataframe數(shù)據(jù)輸出如下:

pdf 53頁(yè)如下:

實(shí)際上,大家也發(fā)現(xiàn),我們獲取的最后一頁(yè)的數(shù)據(jù)還有一部分是另一個(gè)表的,所以我們需要將其去除,并且有序的設(shè)置行索引,再保存到 csv 文件中。
# 去除后三行
pdf_df = pdf_df.iloc[:-3,:]
# 重置索引
pdf_df = pdf_df.reset_index(drop=True)
# 保存到 csv 文件中
pdf_df.to_csv("mt_2018.csv")

當(dāng)然,今天就到這里,其它的需求我們下次給大家完善。大家也可以自己將代碼封裝成函數(shù),這樣就可以實(shí)現(xiàn)傳入 pdf文件名稱、頁(yè)數(shù)以及保存的文件名來(lái)復(fù)用代碼。如果大家再掌握了 pandas 就可以根據(jù)自己的需求,對(duì)各個(gè)表格數(shù)據(jù)進(jìn)行處理。再結(jié)合 seaborn 繪圖可視化,完爆 excel ~ 快學(xué)習(xí)起來(lái)叭,GOGOGO
以上就是Python讀取pdf表格寫入excel的方法的詳細(xì)內(nèi)容,更多關(guān)于Python讀取pdf表格寫入excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)投影法分割圖像示例(一)
今天小編就為大家分享一篇Python實(shí)現(xiàn)投影法分割圖像示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Pandas中df.loc[]與df.iloc[]的用法與異同?
本文主要介紹了Pandas中df.loc[]與df.iloc[]的用法與異同,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧?2022-07-07
Python基于dom操作xml數(shù)據(jù)的方法示例
這篇文章主要介紹了Python基于dom操作xml數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Python針對(duì)xml格式文件的加載、讀取、節(jié)點(diǎn)與屬性遍歷等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Python中實(shí)現(xiàn)字符串類型與字典類型相互轉(zhuǎn)換的方法
這篇文章主要介紹了Python中實(shí)現(xiàn)字符串類型與字典類型相互轉(zhuǎn)換的方法,非常實(shí)用,需要的朋友可以參考下2014-08-08
python3解析庫(kù)BeautifulSoup4的安裝配置與基本用法
簡(jiǎn)單來(lái)說(shuō),BeautifulSoup就是Python的一個(gè)HTML或XML的解析庫(kù),我們可以用它來(lái)方便地從網(wǎng)頁(yè)中提取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python3解析庫(kù)BeautifulSoup4的安裝配置與基本用法的相關(guān)資料,需要的朋友可以參考下2018-06-06
Python torch.flatten()函數(shù)案例詳解
這篇文章主要介紹了Python torch.flatten()函數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
keras中epoch,batch,loss,val_loss用法說(shuō)明
這篇文章主要介紹了keras中epoch,batch,loss,val_loss用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Python實(shí)現(xiàn)智慧校園自動(dòng)評(píng)教全新版
上一次的智慧校園自動(dòng)評(píng)教是用的selenium庫(kù)去模擬人去對(duì)瀏覽器進(jìn)行點(diǎn)擊操作,雖然比手動(dòng)評(píng)教要快,但是效率還是不高.從而想去嘗試重新寫一份不用selenium的評(píng)教方案,功夫不負(fù)有心人,最終成功了,需要的朋友可以參考下2021-06-06
Pytorch固定隨機(jī)數(shù)種子的方法小結(jié)
在對(duì)神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練時(shí),有時(shí)候會(huì)存在對(duì)訓(xùn)練過(guò)程進(jìn)行復(fù)現(xiàn)的需求,然而,每次運(yùn)行時(shí) Pytorch、Numpy 中的隨機(jī)性將使得該目的變得困難重重,基于此,本文記錄了 Pytorch 中的固定隨機(jī)數(shù)種子的方法,需要的朋友可以參考下2023-12-12
pandas多級(jí)分組實(shí)現(xiàn)排序的方法
下面小編就為大家分享一篇pandas多級(jí)分組實(shí)現(xiàn)排序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

