[784]python解析PDF表格
- 2020 年 3 月 28 日
- 筆記
通過看別人寫的部落格,發現python裡面有關PDF解析的通常有以下四種:
- pdfminer,擅長僅僅是文字的解析,本小白試過了,是把表格解析成普通的文本,還經常會伴隨一些莫名奇妙的不認識的符號。這個方案pass掉
- pdf2html,看例是把pdf解析成html,但是html的標籤並沒有規律,解析一個還行,但是本小白是許多的pdf文檔下小標題的表格,這個方案直接pass掉
- tabula,這個是我看過的前輩寫的部落格中使用最多的,本人用過了。對於簡單的表格,也就是單元格中沒有換行的,表頭表尾形式不複雜的,這個方案的值得推薦。電腦需要有Java的環境。
- pdfplumber,這個是看了知乎上的一個大佬的發現,並且自己安裝成功之後,發現最小眾,但是最符合我的需求的解決方案。前提是是需要安裝ImageMagick的
方案1:tabula
import tabula # Read pdf into DataFrame df = tabula.read_pdf("./P26.pdf",pages=str(1)) print(df)
這個直接返回的是一個數據幀,所以就直接是結構化的數據啦!
輸出結果是這樣的:
[ 序號 疑似失聯私募機構 0 1 中投國美投資基金管理(北京)有限公司 1 2 北京嘉宸投資基金有限公司 2 3 中融國晟投資基金管理(北京)有限公司 3 4 奧尼斯特(北京)投資基金管理有限公司 4 5 北京國信聯盟投資基金管理有限公司]
方案2:pdfplumber
import pdfplumber import pandas as pd pdf = pdfplumber.open("./P26.pdf") p0 = pdf.pages[0]#注意此處的pages是一個列表,索引是從0開始的 table = p0.extract_table() df = pd.DataFrame(table[1:], columns=table[0]) # df = pd.DataFrame(table[2:], columns=table[1]) print(df)
輸出結果是這樣的:
序號 NaN NaN 疑似失聯私募機構 NaN NaN 0 1 中投國美投資基金管理(北京)有限公司 1 2 北京嘉宸投資基金有限公司 None None 2 3 中融國晟投資基金管理(北京)有限公司 None None 3 4 奧尼斯特(北京)投資基金管理有限公司 None None 4 5 北京國信聯盟投資基金管理有限公司 None None
雖然為了展示對比的方便,這裡都是用了同樣的一個表格,但是方案2的解決真的要比1好
別問我為啥知道2比1好,你試試用1去解析一些帶有文字格式的表格,帶有複雜的表頭的表格,你就知道啦!我在這裡並沒有在瞎說,而且還得裝的的java的,後者只裝一個的ImageMagick的就行,而且ImageMagick的很有用的
pandas.core.frame.DataFrame 切片技巧
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(6,4), columns=list('ABCD')) print(df.iloc[3]) # 輸出第4行的值 索引以0開頭 print(df.iloc[3:5, 0:2]) # 輸出4-5行,1到2列 print(df.iloc[[1, 2, 4], [0, 2]]) # 輸出不連續行列的樹 print(df.iat[1, 1]) # 提取2行2列的數,提取單個數iat效率更高 print('分割線','*'*200)