pytesseract中tessedit_char_whitelist无法兼容引号的问题咨询
报错原因及解决方案:让pytesseract白名单支持引号字符
为啥会报错?
你遇到的问题主要出在两个核心层面,还有一个容易忽略的小细节:
- Python字符串解析冲突:你用三重双引号
"""来写配置字符串,但白名单里直接放了双引号",Python会把这个双引号当成字符串的结束标记,直接触发语法错误——这也是你看到Traceback的直接原因。 - Tesseract命令行参数解析坑:就算你把Python字符串的问题搞定了,当pytesseract把配置传给Tesseract命令行时,引号会被系统的命令行解析器当成参数分隔符,导致Tesseract接收到的白名单不完整,识别不了引号字符。
- 小细节:你白名单里写的
<是HTML转义后的<,Tesseract会把它当成三个独立的字符&、l、t,而不是小于号,得改成直接写<才行。
一步步解决问题
1. 先搞定Python字符串的语法问题
这里有两种简单可靠的写法,选一个你习惯的就行:
写法一:用三重单引号的原始字符串
带r前缀的三重单引号字符串,可以直接包含单引号和双引号,不会触发字符串终止,写起来最省心:
tesseract_config = r''' -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#'<>(){};:" '''
写法二:单引号包裹+转义内部单引号
如果喜欢用单引号字符串,只需要把内部的单引号用\'转义,双引号直接写就行:
tesseract_config = r'-c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#\'<>(){};:"'
2. 让Tesseract正确识别引号字符
为了避免命令行解析器吃掉你的引号,最好把整个白名单的值用单引号在Tesseract的参数里包裹起来,这样内部的引号会被当作普通字符处理。调整后的配置如下:
# 适配Windows/Linux/macOS的通用写法 tesseract_config = r''' -c tessedit_char_whitelist='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#\'<>(){};:\"' '''
这里的逻辑是:Tesseract会把单引号包裹的内容完整当作白名单,内部的单引号用\'转义,双引号用\"转义,确保命令行解析时不会被截断。
3. 修复HTML转义的小问题
把白名单里的<改成<,不然Tesseract识别的是&、l、t三个字符,不是你想要的小于号。
完整可运行的代码示例
from PIL import Image import pytesseract # 修正后的配置 tesseract_config = r''' -c tessedit_char_whitelist='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#\'<>(){};:\"' ''' tesseract_language = "eng" # 识别图片 text = pytesseract.image_to_string( Image.open('res/outc001.jpg'), lang=tesseract_language, config=tesseract_config ) print(text)
排错小技巧
如果还是不行,可以打印出pytesseract生成的完整命令,看看参数有没有问题:
# 查看生成的命令行 print(pytesseract.build_tesseract_cmd( image_filename='res/outc001.jpg', output_filename='temp', extension='txt', lang=tesseract_language, config=tesseract_config ))
通过检查命令,你能直观看到白名单参数是否被正确传递给Tesseract,方便排查问题。
内容的提问来源于stack exchange,提问作者Mixony
相关产品推荐
相关产品推荐

