Python讀取pdf表格寫入excel的方法
背景
今天突然想到之前被要求做同性質銀行的數據分析。媽耶!十幾個銀行,每個銀行近5年的財務數據,而且財務報表一般都是 pdf 的,我們將 pdf 中表的數據一個個的拷貝到 excel 中,再借助 excel 去進行求和求平均等聚合函數操作,完事瞭還得把求出來的結果再統一 CV 到另一張表中,進行可視化分析…
當然,那時風流倜儻的 老Amy 還熟練的玩轉著 excel ,也是個秀兒~ 今天就思索著,如果當年我會 Python 是不是可以讓我成為班級最靚的崽!用技術占領高地,HHH,所以今天我來瞭,希望可以幫助大傢解決同性質的問題。
開始學習叭
避免CV大法
pdf 文件的表格的數據可以復制,但是這是一項非常繁瑣的事情。所以我首先考慮的是,Python 可否幫助我們高效且規范地讀取 pdf 中的表格數據。所以一頓的檢索,發現瞭一個比較優質處理 pdf 的庫:pdfplumber,當然這個庫需要大傢 pip install pdfplumber 去進行安裝。以及詳細使用可參考全球最大基友社區:https://github.com/jsvine/pdfplumber
步驟:
- 導入 pdfplumber 庫
- 通過 pdfplumber.open() 函數 獲取 mt2018.pdf 文件對象
- 通過該 對象.pages 獲取 pdf 每頁的對象,截取我們需要的頁對象即可
- 通過 頁對象.extract_tables() 獲取表格數據(若需要獲取文本:頁對象.extract_text())
代碼實現:
import pdfplumber # 獲取 pdf 文件對象 pdf_mt = pdfplumber.open("mt2018.pdf") # 因為我需要獲取的資產負債表在 51-53頁 但是索引從0開始 所以切片取 50-52即可 for pdf_pg in pdf_mt.pages[50:53]: # 隻提取當前頁表格數據 print(pdf_pg.extract_tables()) -------------------------------------------------------------------------- 結果比較多,截取一部分: [[['項目', '附註', '期末餘額', '期初餘額'], ['流動資產:', '', '', ''], ['貨幣資金', '1', '112,074,791,420.06', '87,868,869,913.34'], ['結算備付金', '', '', ''], ['拆出資金', '', '', ''], ['以公允價值計量且其變動計入當\n期損益的金融資產', '', '', ''], ['衍生金融資產', '', '', ''], ['應收票據及應收賬款', '2', '563,739,710.00', '1,221,706,039.00']]]
將完整表保存到 csv 文件中
我們發現,返回的數據集是一個三維的列表。那麼在我們平時處理的 excel 表格數據(行與列)都是二維的數據。那麼,這多出的一維是什麼呢?其實就是我們的夜[頁]~ 再來一個循環取出二維數據進行保存即可
for pdf_pg in pdf_mt.pages[50:53]: for pdf_tb in pdf_pg.extract_tables(): print(pdf_tb) ------------------------------------------------------------------------------ 結果比較多,截取一部分: [['項目', '附註', '期末餘額', '期初餘額'], ['流動資產:', '', '', ''], ['貨幣資金', '1', '112,074,791,420.06', '87,868,869,913.34'], ['結算備付金', '', '', ''], ['拆出資金', '', '', ''], ['以公允價值計量且其變動計入當\n期損益的金融資產', '', '', ''], ['衍生金融資產', '', '', ''], ['應收票據及應收賬款', '2', '563,739,710.00', '1,221,706,039.00']]
但是,真的那麼簡單嗎?這時,我們就需要細品我們的 pdf 瞭,如下圖
我們發現,一張完整的資產負債表分佈在多頁上。也就是說,每一頁的裡面的表格數據都是一個三維的列表,所以我們保存數據的時候,需要讓其有共同的表頭(列索引),並且進行拼接。
那必須就要強推我們的 pandas 瞭,pandas.DataFrame() 非常完美的創建表格式的二維數組,以及指定列索引(表頭)。包括可以直接 使用 df.append() 進行共同表頭數據的堆疊拼接。
import pdfplumber import pandas as pd import numpy as np # 創建僅有表頭的 dataframe 數組 pdf_df = pd.DataFrame(columns=['項目', '附註', '期末餘額', '期初餘額']) # 獲取 pdf 文件對象 pdf_mt = pdfplumber.open("mt2018.pdf") # 因為我需要獲取的資產負債表在 51-53頁 但是索引從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=['項目', '附註', '期末餘額', '期初餘額'])) # 顯示後五條 pdf_df.tail()
dataframe數據輸出如下:
pdf 53頁如下:
實際上,大傢也發現,我們獲取的最後一頁的數據還有一部分是另一個表的,所以我們需要將其去除,並且有序的設置行索引,再保存到 csv 文件中。
# 去除後三行 pdf_df = pdf_df.iloc[:-3,:] # 重置索引 pdf_df = pdf_df.reset_index(drop=True) # 保存到 csv 文件中 pdf_df.to_csv("mt_2018.csv")
當然,今天就到這裡,其它的需求我們下次給大傢完善。大傢也可以自己將代碼封裝成函數,這樣就可以實現傳入 pdf文件名稱、頁數以及保存的文件名來復用代碼。如果大傢再掌握瞭 pandas 就可以根據自己的需求,對各個表格數據進行處理。再結合 seaborn 繪圖可視化,完爆 excel ~ 快學習起來叭,GOGOGO
以上就是Python讀取pdf表格寫入excel的方法的詳細內容,更多關於Python讀取pdf表格寫入excel的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- python用pdfplumber提取pdf表格數據並保存到excel文件中
- 基於Python實現文本文件轉Excel
- Python 操作pdf pdfplumber讀取PDF寫入Exce
- python數學建模之三大模型與十大常用算法詳情
- Python Pandas學習之Pandas數據結構詳解