【发布时间】:2021-04-22 06:17:07
【问题描述】:
我创建了一个代码来解析多个 pdf 文件并从每个页面返回一行数据。我遇到了一个问题,即我的 pdf 文件中的某些页面没有这一行。发生这种情况时,我的代码会完全忽略该页面;但是我希望它为找不到指定行的页面打印一个“无”。我认为这是一个简单的修复,但事实证明它比我想象的要复杂一些。这是我正在拉的线以及我尝试过的示例:
#pattern I told my code to look for within each page of pdf
sqft_re = re.compile('(\d+(sqft)\s+[$]\d+[.]\d+\s+\d{2}/\d{2})')
#this is an example of what the line I want in each page looks like:
'1600sqft $154.98 10/14'
基本上,我希望代码能够解析每个 pdf 并在可以找到的情况下返回该行。如果不能,我希望它在没有该行的情况下为所述页面返回一个“无”。我已将这些行称为这样的列表:
lines = []
这是我如何设置我的 for 循环来浏览我的 pdf 文件的每一页:
for files in os.listdir(directory):
if files.endwith(".pdf"):
with pdfplumber.open(files) as pdf:
pages = pdf.pages
for page in pdf.pages:
text = page.extract_text()
for line in text.split('\n'):
line = sqft_re.search(line)
if line:
line.group(1)
lines.append(line)
输出示例:
lines
'1600sqft $154.98 10/14'
'1450qft $113.02 07/05'
'90sqft $60.17 05/12'
'3000sqft $500.98 09/20'
此代码成功返回带有该行的页面的数据列表。但是,没有该行的页面将被省略。以下是我认为可以解决问题的方法,只需为没有该行的页面打印 none:
for files in os.listdir(directory):
if files.endwith(".pdf"):
with pdfplumber.open(files) as pdf:
pages = pdf.pages
for page in pdf.pages:
text = page.extract_text()
for line in text.split('\n'):
line = sqft_re.search(line)
if line:
line.group(1)
else:
line = 'None'
lines.append(line)
但是这不起作用,现在不是只用“无”代替没有值的页面,pdf 页面中的每一行都打印为“无”,除了它与该行匹配的位置。所以基本上我现在有一个看起来像这样的列表:
lines
'None'
'None'
'None'
'1600sqft $154.98 10/14'
'None'
'None'
'None'
'1450qft $113.02 07/05' #etc.....
我尝试了一些其他的事情,比如当它与我正在寻找的不匹配时调用一个不同的函数,用我自己的字符串来替换这个值等等。我仍然遇到同样的问题。在我的示例 pdf 中,只有一页没有此行,因此我的列表应如下所示:
'1600sqft $154.98 10/14'
'1450qft $113.02 07/05'
'90sqft $60.17 05/12'
'3000sqft $500.98 09/20'
'None'
我对 python 也很陌生(R 是我主要使用的),所以我确信我在这里忽略了一些东西,但是对于我所缺少的东西的任何指导将不胜感激!
【问题讨论】:
-
您的
if line: line.group(1) else: line = 'None'不正确:line.group(1)没有做任何事情。通常,您应该为每个页面设置一个标志,并且仅在没有匹配行的情况下将None添加到lines。缩进要非常小心:lines.append('None')应该只在页面处理后出现。 -
@WiktorStribiżew 不想占用您的时间,但作为 python 的新手,我想进一步了解您的第一条评论为什么
line.group(1)不做任何事情,您基本上是在说我应该只创建一个标志变量而不是使用 else 语句? -
@WiktorStribiżew 对,所以它是一个标志变量。谢谢你。老实说,我什至没有想到这一点。非常感谢!
标签: python regex if-statement pdf conditional-statements