Python从EasyOCR输出文本提取阿拉伯数字失败及索引异常问题
阿拉伯文页码提取异常问题分析与解决
问题原因
- start_idx为2而非0:你的文本文件开头存在不可见的Unicode控制字符(比如UTF-8 BOM
\ufeff、零宽空格等),这些字符占据了开头的索引位置,导致目标字符串"صفحه رقم"从索引2开始。 - 提取结果为空:你要提取的"ا"是阿拉伯文字母(常被用来表示数字1),但代码中使用
filter(str.isdigit)过滤字符——str.isdigit()不会将阿拉伯字母"ا"识别为数字,因此过滤后结果为空。同时,substr.split()[0]得到的就是"ا",但被过滤逻辑清空了。
修正方案
步骤1:清理文本开头的隐藏字符
先移除文件开头的BOM或控制字符,确保目标字符串从正确位置开始。
步骤2:调整提取逻辑
直接提取目标字符串后的第一个元素,无需用数字过滤;如果需要将字母"ا"转换为数字1,可添加字符映射。
修正后的代码
with open(r'file.txt', 'r', encoding='utf-8') as f: text = f.read() # 移除开头的BOM及空白控制字符 text = text.strip('\ufeff').strip() page_num_str = 'صفحه رقم' start_idx = text.find(page_num_str) if start_idx != -1: # 截取目标字符串后的内容并去除首尾空格 substr = text[start_idx + len(page_num_str):].strip() # 直接获取第一个词 page_num = substr.split()[0] # 可选:将阿拉伯字母ا映射为数字1 num_mapping = {'ا': '1', '١': '1'} page_num = num_mapping.get(page_num, page_num) print("Page number extracted: ", page_num)
验证方法
可以先打印文本的原始表示,确认开头的隐藏字符:
with open(r'file.txt', 'r', encoding='utf-8') as f: text = f.read() print(repr(text))
输出会显示类似"\ufeffصفحه رقم ا من ٤"的内容,其中\ufeff就是导致索引偏移的BOM字符。
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

