使用dateparser库提取OCR文件日期出现NameError与TypeError问题求助
报错原因分析
1. NameError: name 'dates' is not defined
原代码逻辑存在两处核心问题导致该错误:
- 分支逻辑混乱:当正则表达式没有匹配到
Dresden开头的内容时,会进入else分支,此时date本身是None,但你依然在该分支内调用date.group(3),会先触发属性报错,中断dates变量的赋值流程,后续执行data.append时就找不到已定义的dates变量。 - 分支覆盖不全:部分执行路径下没有对
dates做初始化赋值,直接引用就会触发未定义报错。
2. TypeError: Input type must be str
该错误是dateparser.parse方法抛出的,要求传入的待解析内容必须是字符串类型,触发原因:
- 你把第二种日期格式的回退解析逻辑错误写在了正则匹配失败的分支里,此时
date为None,date.group(3)的返回值不是合法字符串。 - 没有对正则提取到的
date.group(3)做空值、非字符串校验,当提取结果为空或者非字符串时,直接传入解析方法就会触发类型错误。
修复后的完整代码
# 先补全所有缺失的依赖导入 import glob import re import pandas as pd import dateparser import pytesseract from PIL import Image data = [] listOfPages = glob.glob(r"C:/Users/name/folder/test/*.tif") # 正则预编译提到循环外,提升性能 date_pattern = re.compile(r'(Dresden(\.|,|\s+)?)(.*)', flags = re.DOTALL | re.MULTILINE) for entry in listOfPages: text1 = pytesseract.image_to_string( Image.open(entry), lang="deu" ) text = re.sub(r'\n',' ', text1) date_match = date_pattern.search(text) dates = None # 只有正则匹配成功才走解析逻辑 if date_match: date_raw = date_match.group(3).strip() # 确保提取到的内容是非空字符串再解析 if date_raw: # 先试第一种格式 dates = dateparser.parse(date_raw, date_formats=['%d %m %Y'], languages=['de'], settings={'STRICT_PARSING': True}) # 第一种解析失败再试第二种格式 if not dates: dates = dateparser.parse(date_raw, date_formats=['%d %B %Y'], locale = 'de', settings={'STRICT_PARSING': True}) data.append([text, dates]) df0 = pd.DataFrame(data, columns =['raw_text', 'dates']) print(df0)
额外优化说明
- 将正则预编译放到循环外,避免每次循环重复编译正则表达式,提升执行效率
- 新增了提取内容的空值校验,避免无效解析报错
- 修正了回退解析的逻辑位置,只有第一种格式解析失败时才会触发第二种格式的解析
- 变量命名更清晰,避免和内置的
date模块重名引发潜在问题
内容的提问来源于stack exchange,提问作者id345678
相关产品推荐
相关产品推荐

