TypeError:需要一个类似字节的对象,而不是 python 3.5.2 和 pytesseract 中的“str”

Posted

技术标签:

【中文标题】TypeError:需要一个类似字节的对象,而不是 python 3.5.2 和 pytesseract 中的“str”【英文标题】:TypeError: a bytes-like object is required, not 'str' in python 3.5.2 and pytesseract 【发布时间】:2017-05-13 03:08:41 【问题描述】:

我正在使用 python 3.5.2 和 pytesseract,当我运行我的代码时出现错误 TypeError: a bytes-like object is required, not 'str',(详情如下):

代码:File "D:/test.py"

# -*- coding: utf-8 -*-

try:
    import Image
except ImportError:
    from PIL import Image

import pytesseract


print(pytesseract.image_to_string(Image.open('d:/testimages/name.gif'), lang='chi_sim'))
print(pytesseract.image_to_string(Image.open('d:/testimages/mobile.gif')))

错误:

Traceback (most recent call last):
  File "D:/test.py", line 11, in <module>
    print(pytesseract.image_to_string(Image.open('d:/testimages/name.gif'), lang='chi_sim'))
  File "C:\Users\dell\AppData\Local\Programs\Python\Python35\lib\site-packages\pytesseract\pytesseract.py", line 164, in image_to_string
    errors = get_errors(error_string)
  File "C:\Users\dell\AppData\Local\Programs\Python\Python35\lib\site-packages\pytesseract\pytesseract.py", line 112, in get_errors
    error_lines = tuple(line for line in lines if line.find('Error') >= 0)
  File "C:\Users\dell\AppData\Local\Programs\Python\Python35\lib\site-packages\pytesseract\pytesseract.py", line 112, in <genexpr>
    error_lines = tuple(line for line in lines if line.find('Error') >= 0)
TypeError: a bytes-like object is required, not 'str'

我该怎么办?

编辑:

我已将训练数据下载到C:\Program Files (x86)\Tesseract-OCR\tessdata,如下所示:

我将error_string = error_string.decode("utf-8")这一行插入get_errors(),错误是这样的:

Traceback (most recent call last):
  File "D:/test.py", line 11, in <module>
    print(pytesseract.image_to_string(Image.open('d:/testimages/name.gif'), lang='chi_sim'))
  File "C:\Users\dell\AppData\Local\Programs\Python\Python35\lib\site-packages\pytesseract\pytesseract.py", line 165, in image_to_string
    raise TesseractError(status, errors)
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \\Program Files (x86)\\Tesseract-OCR\\tessdata/chi_sim.traineddata')

【问题讨论】:

【参考方案1】:

这是 pytesseract 中的一个已知错误,请参阅issue #32:

tesseract 输出的错误解析很脆弱:需要一个类似字节的对象,而不是 'str'

tesseract 实际上有一个错误。但是在 Python 端会发生错误,因为 error_string 返回一个字节文字,并且 geterrors 调用似乎有问题

解决方法是安装给定语言的训练数据,请参阅Tesseract running error,或通过编辑site-packages\pytesseract\pytesseract.py 并在get_errors() 函数顶部(第109 行)插入额外的一行:

error_string = error_string.decode("utf-8")

然后函数读取:

def get_errors(error_string):
    '''
    returns all lines in the error_string that start with the string "error"
    '''

    error_string = error_string.decode("utf-8")
    lines = error_string.splitlines()
    error_lines = tuple(line for line in lines if line.find('Error') >= 0)
    if len(error_lines) > 0:
        return '\n'.join(error_lines)
    else:
        return error_string.strip()

【讨论】:

@zwl1619:我对 pytessaract 的工作原理并不那么。修复编码错误表明训练数据没有按照预期的方式安装。之前曾抛出该错误,但由于编码问题,您从未得到它。也许是某种权限问题?

以上是关于TypeError:需要一个类似字节的对象,而不是 python 3.5.2 和 pytesseract 中的“str”的主要内容,如果未能解决你的问题,请参考以下文章

“TypeError:在 OAuth 2.0 回调请求期间需要一个类似字节的对象,而不是 'str'”

诱变剂:TypeError:需要一个类似字节的对象,而不是“str”

TypeError:需要一个类似字节的对象,而不是“str”套接字编程

Django Rest Framework TypeError需要一个类似字节的对象,而不是'str'

TypeError:需要一个类似字节的对象,而不是使用 pickle 加载时的“str”

TypeError:在尝试发送 http 请求时需要一个类似字节的对象,而不是“str”