Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UnicodeDecodeError';charmap';Python中带有Tesseract OCR的编解码器_Python_Character Encoding_Tesseract_Python Tesseract - Fatal编程技术网

UnicodeDecodeError';charmap';Python中带有Tesseract OCR的编解码器

UnicodeDecodeError';charmap';Python中带有Tesseract OCR的编解码器,python,character-encoding,tesseract,python-tesseract,Python,Character Encoding,Tesseract,Python Tesseract,我正在尝试使用teseract OCR对python中的图像文件进行OCR。 我的环境是—— Windows计算机上的Python 3.5 Anaconda 代码如下: from PIL import Image from pytesseract import image_to_string out = image_to_string(Image.open('sample.png')) 我得到的错误是: File "Anaconda3\lib\sitepackages\pytesseract\

我正在尝试使用teseract OCR对python中的图像文件进行OCR。 我的环境是—— Windows计算机上的Python 3.5 Anaconda

代码如下:

from PIL import Image
from pytesseract import image_to_string
out = image_to_string(Image.open('sample.png'))
我得到的错误是:

File "Anaconda3\lib\sitepackages\pytesseract\pytesseract.py", line 167, in image_to_string
return f.read().strip()
File "Anaconda3\lib\encodings\cp1252.py", line 23 in decode
return codecs.charmap_decode(input, self.errors, decoding_table)[0]
UnicodeDecodeError:'charmap' codec can't decode byte 0x81 in position 1583: character maps to <undefined>
文件“Anaconda3\lib\sitepackages\pytesseract\pytesseract.py”,第167行,在图像到字符串中
返回f.read().strip()
文件“Anaconda3\lib\encodings\cp1252.py”,解码中的第23行
返回编解码器.charmap\u解码(输入,self.errors,解码表)[0]
UnicodeDecodeError:“charmap”编解码器无法对1583位置的字节0x81进行解码:字符映射到
我试过上面提到的解决办法 黑客没用了

我在Mac OS上试过我的代码,它正在工作

我已经调查了pytesseract问题: 这是一个


谢谢

嗯……那里发生了一些非常奇怪的事情- 当我们谈论“latin1”文本编码时,字符“\x81”是不可打印的。然而,在库使用的“cp1252”编码上,它被映射到一个“未定义的字符”——这是显式的

发生的情况是,“latin1”在某种程度上是一种“无操作”编解码器,有时在Python中用于简单地将字节序列转换为unicode字符串(Python 3.x中的默认字符串)。编解码器“cp1252”几乎是相同的,在某些情况下,它可以与拉丁语1互换使用-但是这个“\x81”代码是两者之间的一个区别。对你来说,这是一个至关重要的问题

正确的做法是尝试为
image\u to\u string
函数提供可选的
lang
参数,以便它可以使用正确的编解码器对文本进行解码,前提是它能够更好地识别它显示的字符是“0x81”。然而,这可能不起作用——因为这可能只是一个与语言无关的非常奇怪的字符的OCR错误

因此,您的解决方法是monkeypatch“cp1252”编解码器,这样它就不会出现错误,而是填充一个Unicode“无法识别”字符-一种方法是在调用tesseract之前取消这些行:

from encodings import cp1252
original_decode  = cp1252.Codec.decode
cp1252.Codec.decode =  lambda self, input, errors="replace": original_decode(self, input, errors)
但是,如果可以,请打开pytesseract项目的bug报告。我猜他们现在应该使用“拉丁1”而不是“cp1252”编码