问题描述
我正在使用 Python 中的 pdfplumber 库和 re 模块来遍历多页 pdf 文档并从每个页面中提取特定数据,例如样本编号、日期、位置等。除了一些扫描的页面外,pdf 中的每一页都采用相同的格式。我试图实现的基本逻辑是:
如果没有找到文本,即页面被扫描:
如果找到文本:
- 对于每个变量,即“samp”、“date”和“loca”,迭代 每行文本并将匹配的值分配给变量。
- 如果未找到匹配项,即 re 函数未找到匹配项 匹配,分配一些文本,例如“第 1 页:位置丢失”到 该页面上的变量,因此当我将 Pandas 数据框导出到 csv 时,我知道 哪些页面需要手动检查缺失数据。
到目前为止,我已经使用下面的代码成功地从 pdf 中提取了所需的数据,然后用它创建了一个 Pandas 数据框。但是,如果 re 函数找不到特定变量的匹配项,则代码似乎只是重用该变量的最后一个匹配值,例如如果 re 函数在第 3、4 和 5 页上找不到与 'loca' 变量匹配的值,那么它只会重用在第 2 页上找到的最后一个匹配值。我尝试了许多不同的方法,例如添加每个“if 行:语句”下面都有一个 else 语句,但这似乎只是完全绕过了前面的 if 语句。我怀疑这是因为代码正在检查 pdf 中的所有行,并且由于第一行永远不会匹配,它只是移至 else 语句并将那里给出的值分配给每个变量。
对于我如何改进以下代码并实现我的目标的任何评论或建议将不胜感激。我最近才开始学习编程,这是我的第一段代码 - 所以请保持温和! :-)
with pdfplumber.open(directory) as pdf:
pages = pdf.pages
for i,page in enumerate(pages):
text = page.extract_text(x_tolerance=2,y_tolerance=3)
#if no text is found,i.e. page is scanned
if text is None:
print('Page:',i+1,'No text found')
#if text is found iterate through lines in text and extract required data
else:
for line in text.split('\n'):
line = samp_re.search(line)
if line:
samp = line.group(1)
#tried adding else statement
else:
samp = 'Page:','Sample Ref. missing'
for line in text.split('\n'):
line = date_re.search(line)
if line:
date = line.group(1)
#tried adding else statement
else:
date = 'Page:','date missing'
for line in text.split('\n'):
line = loca_re.search(line)
if line:
loca = line.group(1)
#tried adding else statement
else:
loca = 'Page:','Location missing'
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)