You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:06:07