更多精彩內(nèi)容請移步微信公眾號:Python for Finance
本文介紹一個開源python工具庫-pdfplumber傻工,可以方便地獲取pdf的各種信息,包括文本、表格罚舱、圖表培愁、尺寸等著摔。它不支持修改或生成pdf。
一定续、pdfplumber安裝
由于Anaconda沒有集成pdfplumber庫谍咆,因此需要安裝。安裝方式:打開Anaconda Prompt私股,選擇開始菜單-Anaconda3-Anaconda Prompt摹察。
命令行中輸入
pip install pdfplumber
二、pdfplumber運用步驟
(一)讀取pdf
import pdfplumber
pdf=pdfplumber.open(r'C:\Users\chenwei\Downloads\貴州茅臺2020年年度報告.pdf')
(二)生成page對象
pdfplumber.Page類是pdfplumber整個的核心倡鲸。
通過.pages返回包含pdfplumber.Page實例的列表供嚎,每一個實例代表pdf每一頁的信息,通過列表可訪問具體某一頁。
pages=pdf.pages #生成pdf所有頁面的列表
page01=pdf.pages[0] #返回第一頁對象
步驟一克滴、二也可以with open語句逼争,代碼如下:
with pdfplumber.open(r'C:\Users\chenwei\Downloads\貴州茅臺2020年年度報告.pdf') as pdf:
pages=pdf.pages #生成pdf所有頁面的列表
page01=pdf.pages[0] #返回第一頁對象
(三)對Page對象進行處理
常用方法:
(1)pdfplumber庫提供文本提取函數(shù).extract_text() ,將PDF文檔中的文本內(nèi)容按照原文中的換行格式(并非實際的段落)得到字符串對象劝赔。
(2)pdfplumber庫提供了兩種pdf表格提取函數(shù)誓焦,分別為.extract_tables( )及.extract_table( ),兩種函數(shù)提取結(jié)果存在差異着帽。
A).extract_tables( )
可輸出頁面中所有表格杂伟,并返回一個嵌套列表,其結(jié)構(gòu)層次為table→row→cell启摄。此時稿壁,頁面上的整個表格被放入一個大列表中,原表格中的各行組成該大列表中的各個子列表歉备。
B).extract_table( )
返回獨立列表傅是,其結(jié)構(gòu)層次為row→cell。若頁面中存在多個行數(shù)相同的表格蕾羊,則默認輸出頂部表格喧笔;否則,僅輸出行數(shù)最多的一個表格龟再。此時书闸,表格的每一行都作為一個單獨的列表,列表中每個元素即為原表格的各個單元格內(nèi)容利凑。
三浆劲、pdfplumber常用實例:
(一)提取單頁pdf文字
以讀取《貴州茅臺2020年年度報告》pdf第28頁文本為例,代碼如下:
import pdfplumber
with pdfplumber.open(r'C:\Users\chenwei\Downloads\貴州茅臺2020年年度報告.pdf') as pdf:
page28 = pdf.pages[27] #指定讀取第28頁
text = page28.extract_text()#提取文本
print(text)
(二)提取所有頁面pdf文字并寫入文本
以讀取《貴州茅臺2020年年度報告》pdf文本并寫入txt文件為例哀澈,代碼如下:
import pdfplumber
with pdfplumber.open(r'C:\Users\chenwei\Downloads\貴州茅臺2020年年度報告.pdf') as pdf:
for page in pdf.pages:
text = page.extract_text()#提取文本
txt = open(r'C:\Users\chenwei\Downloads\貴州茅臺2020年年度報告.txt',mode='a',encoding='utf-8')
txt.write(text)
(三)提取單頁面的單個表格
采用extract_table()方法提取單個表格牌借,若頁面中存在多個行數(shù)相同的表格,則默認輸出頂部表格割按;否則膨报,僅輸出行數(shù)最多的一個表格。
以讀取《貴州茅臺2020年年度報告》pdf第9頁單個表格為例适荣,第9頁有多個表格现柠,其中,成本分析表是行數(shù)最多的一個表格弛矛,采用extract_table()方法則默認輸出該表格够吩。
import pdfplumber
import pandas as pd
with pdfplumber.open(r'C:\Users\chenwei\Downloads\貴州茅臺2020年年度報告.pdf') as pdf:
page09 = pdf.pages[8] # 第九頁的信息
table= page09.extract_table() #提取單個表格
table=pd.DataFrame(table[1:],columns=table[0]) #得到的table是嵌套list類型,轉(zhuǎn)化成DataFrame更加方便查看
print(table)
(四)提取所有頁面的所有表格丈氓,并存到excel的不同sheet中
這涉及pandas將多個dataframe以多個sheet的形式保存到一個excel文件中废恋,需要采用 ExcelWriter方法谈秫。代碼如下:
import pdfplumber
import pandas as pd
writer=pd.ExcelWriter(r'C:\Users\chenwei\Desktop\貴州茅臺2020年年度報告數(shù)據(jù).xls')
with pdfplumber.open(r'C:\Users\chenwei\Downloads\貴州茅臺2020年年度報告.pdf') as pdf:
for j in range(len(pdf.pages)):
page=pdf.pages[j]
tables = page.extract_tables() #提取多個表格
for i in range(len(tables)):
table=tables[i]
table=pd.DataFrame(table[1:],columns=table[0])
table.to_excel(writer,index=False,sheet_name=f'第{j+1}頁表格{i+1}')
writer.save()
writer.close()