python如何从一个dataframe提取相应的行组成一个新的dataframe_PDF文件信息不会提取怎么办??别急!Python帮你解决...

点击上方“数据管道”,选择“置顶星标”公众号

干货福利,第一时间送达

9ba9e9f5883143403d296d8e3f828157.png

01. 引言

在大多数常规数据文件中,pdf文件因其特殊的性质导致对其信息进行智能解析、提取、甚至批量化处理造成一定的困难,本期推文就教你如何使用Python第三方库pdfplumber ( https://github.com/jsvine/pdfplumber ) 对pdf文件进行解析及提取。

02. pdfplumber简介及安装

Pdfplumber是一个可以处理pdf文件格式信息的python第三方库。可以查找关于每个文本字符、矩阵、和行的详细信息,也可以对表格进行提取并进行可视化展示调试。可直接采用pip 进行安装,在命令行中输入:
pip install pdfplumber
但鉴于国内网有时下载巨慢 建议使用 清华镜像进行安装,具体方法可自行百度。

03. pdf文件主要信息(表格+文本)提取

具体的属性及基本使用方法大家都可以去官网自己查看,这里仅介绍常用信息(表格+文本)的提取方法,文件也是使用官网提供的。

(1)表格信息提取

表格提取方法主要包括find_tables()、extract_tables()、extract_table()以及debug_tablefinder()。我们提取表格信息主要使用extract_tables()、extract_table() 方法,而debug_tablefinder() 则是查看表格信息提取的依据。官网解释如下:

ce30f5f48355c3ab905a05b1ab33aa17.png

接下来,我们使用extract_table()结合具体的pdf文件进行介绍说明。Pdf文件信息如下(部分):

0d9a5a82269fa2d8f9bca9373f60a74f.png

提取数据:

import pandas as pdimport pdfplumberpdf = r"pdfplumber-stable\examples\pdfs\ca-warn-report.pdf"ta_pdf = pdfplumber.open(pdf)ta_pdf_info = ta_pdf.pages[0] #获取pdf文件第一页信息tables = ta_pdf_info.extract_table() #获取表格信息tabes[:3]

结果显示如下:

8ab4382e6e0edd2d721f2a2e0dd83f2f.png

使用.extract_table从页面上最大的表中获取数据:.extract_table返回一个镶嵌列表,每个内部列表为表中的一行,对比pdf文件可以发现,主要的信息我们已经提取出来,接下来我们对信息进行保存。

信息保存:

table_df = pd.DataFrame(tables[1:],columns=tables[0])table_df.head()

结果如下:

101231a8366b5c3bd6cc32069db29251.png

这样我们就完美的提取pdf第一页表格信息了,可以发现,Effective和Received列由于是直接提取,导致文本之间存在空格,接下来整理下即可,代码如下:

for column in ["Effective", "Received"]:    table_df[column] = table_df[column].str.replace(" ", "")table_df.head()

结果如下:

167c6fb331b843e20d29067bd5196cef.png

通过pandas的to_excel等文件保存方法即可实现文件另存。到此,我们就实现了pdf第一页表格信息的提取、整理和另存。若想对多页进行批量处理,进行简单的循环处理即可。

此外,我们还可以直接通过 within_bbox()方法直接定位我们需要提取信息的位置进行特定位置信息的提取。within_bbox() 介绍如下:

7b920fae942c2e1961abd49091e3c322.png

(2)文本信息提取

文本信息的提取主要使用extract_text()方法,这里使用的pdf文件预览如下(部分):

6c44b49e920d5ae873cfb3b98a48961c.png

提取文本信息代码如下:

file = r"pdfplumber-stable\examples\pdfs\san-jose-pd-firearm-sample.pdf"text_pdf = pdfplumber.open(file)text_info = text_pdf.pages[0]text = text_info.extract_text()print(text)

结果为:

35c7fee1102689d2453b93379fbd621e.png

对比pdf可知,文本信息已全部提出。这里我们就可以使用正则表达式对提取信息进行筛选。代码如下:

core_part = re.compile(r"LOCATION[\-\s]+(.*)\n\s+Flags = e", re.DOTALL)core = re.search(core_part, text).group(1)print(core)

这里解释下:LOCATION[\-\s]+(.*)\n\s+Flags = e 就是匹配 LOCATION 和 Flags = e 字符串 之间的所有元素,无论换行还是空格等。结果如下:

c3362a46588c48a1b0e520cce92bff78.png

由于使用print()方法进行输出,结果较为规范,但实际情况如下:

341f0ac1d019f5e6937f2a479f26d5f7.png

含有多个换行符号(\n),接下来以此为依据进行拆分(split),如下:

fd1814aee2508f60103e0c63b301d2be.png

再对结果进行提取,代码如下:

line_groups = list(zip(lines[::2], lines[1::2]))line_groups

结果如下:

2ef6bdb24ad646d08478841d671fb935.png

最后使用collections模块中的OrderedDict类 进行字典有序排列,构建pandas所需数据,具体代码如下:

from collections import OrderedDictline_groups = list(zip(lines[::2], lines[1::2]))def parse_row(first_line, second_line):    return OrderedDict([        ("type", first_line[:20].strip()),        ("item", first_line[21:41].strip()),        ("make", first_line[44:89].strip()),        ("model", first_line[90:105].strip()),        ("calibre", first_line[106:111].strip()),        ("status", first_line[112:120].strip()),        ("flags", first_line[124:129].strip()),        ("serial_number", second_line[0:13].strip()),        ("report_tag_number", second_line[21:41].strip()),        ("case_file_number", second_line[44:64].strip()),        ("storage_location", second_line[68:91].strip())    ])parsed = [ parse_row(first_line, second_line)    for first_line, second_line in line_groups ]parsed[:2]

结果如下:

e5376d34da75b0d998fac4487e7f9d7d.png

可以看出,数据已经过整合并符合pandas 构建数据DataFrame形式。如下:

text_df = pd.DataFrame(parsed)text_df

结果如下(部分):

c1c096cdad30dc1ccce28a1a8931c968.png

通过to_excel等方法即可实现另存。

04. 总结

本期推文简单介绍了如何使用Python第三方库pdfplumber 实现对pdf文件解析及基本信息提取。其目的是为大家提供一个数据解决思路,这里只是简单介绍表格信息和文本信息的提取,其他的方法,大家可以查看官网获取啊。

78f5930b8b600e188919483310cf5117.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值