【办公自动化】用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,然后查找关键词。效率比较低。
