【办公自动化】用pdfplumber读取年报pdf中的表格
思路
年报里的表格是长这样的:
首先循环读取指定文件夹中的年报pdf,然后用pdfplumber进行解析,再根据需要的关键词定位页码,进一步导出表格内容,将表格转化为list按行写入空列表。最后将二维列表转化为dataframe。
完整代码
import pandas as pd import pdfplumber import os #获取pdf文件名 def file_name(file_dir): for files in os.walk(file_dir): return files # 这个函数暂时没用到 def parsePDF(files): df3 = pd.DataFrame(columns=[A]) for file in files: file_path = file_dir+file with pdfplumber.open(file_path) as pdf: for i in range(100): pages = pdf.pages[i] tt = pages.extract_text() if tt is None: continue elif 分地区 in tt: l1 = tt.split( ) #根据换行符将文本拆成list l2 = [] for l in l1: l = l.split( ) #再根据空格拆成二维list,因为数据字段之间是用空格分开的,属于分列操作 l2.append(l) # 得到的table是嵌套list类型,转化成DataFrame更加方便查看和分析 df = pd.DataFrame(l2) break else: continue rr = [] for row in df.itertuples(): rr.append(row[1]) k=0 for r in rr: if 分地区 in r: df2 = df.drop(list(range(k))) k=k+1 df3 = pd.concat([df2,df3]) break else: k=k+1 return df3 def parse_pdf2(files): Clist = [] #解析后的内容往这个空列表里面存 for file in os.listdir(file_dir): file_path = str(file_dir)+str(file) print(file_path) with pdfplumber.open(file_path) as pdf: for i in range(100): pages = pdf.pages[i] tt = pages.extract_text() if tt is None: continue elif 分地区 in tt: tables = pages.extract_tables() Clist.append([file]) for table in tables: for row in table: row = [x.strip() for x in row if x!= and x!=None] print(row) Clist.append(row) df = pd.DataFrame(Clist) return df if __name__ == __main__: #年报存放路径 file_dir = D:/2020年报/ files = file_name(file_dir)[-1] #data = parsePDF(files) data = parse_pdf2(files) data.to_excel(D:/test1.xlsx,index=False)
效果
pdfplumber使用总结
1、 extract_tables() 方法适用于可编辑的pdf文档,如图片转的pdf或者扫描pdf不好使,得用OCR工具。
2、通过关键词定位需要先将pdf→text,然后查找关键词。效率比较低。