UnicodeEncodeError和TypeError:只能将str(不是“ bytes”)连接到str

时间:2019-04-07 10:37:36

标签: python unicode python-unicode google-custom-search

我有一个问题,那就是我尝试使用Google Custom Search api搜索python的结果,但是当我搜索存储在变量中的内容而不是手动编写它们时,它说UnicodeEncodeError:'ascii'编解码器可以't在位置104编码字符'\ xa2':序号不在range(128)中。当我用

解决它时
    .encode('ascii', 'ignore').decode('ascii')  

它显示另一个错误,例如Google自定义搜索

    TypeError: can only concatenate str (not "bytes") to str.

PD:我还尝试过诸如str()或.decode之类的事情。

编辑:当然,存储在变量中的输入来自读取图像文本的Pytesseract。因此,我将此信息存储在变量中,然后尝试在Google自定义搜索API中搜索此信息。当它显示Unicode错误时,我在stackoverflow中查看了解决方案,发现我可以尝试对该变量进行.decode,以不再出现此问题。实际上,此问题已解决,但现在又出现了另一个问题,它是TypeError之一:只能将str(而不是“ bytes”)连接到str。因此,我无法使用.decode函数,因为它将显示另一个错误。我该怎么办?

编辑2.0

text_photo = pytesseract.image_to_string(img2) #this will read the text and put it in a variable
text_photo = text_photo.replace('\r', '').replace('\n', '') #this will elimininate de /n


rawData = urllib.request.urlopen(url_google_1 + text_photo1 + '+' + text_photo2 + url_google_2).read() 

url_google 1包含用于Google搜索的链接的第一部分(api键...),第二部分包含我想从google获取的内容。在中间添加变量,因为它是我要搜索的变量。如果我编写的hello效果很好,那么问题是tesseract编写的格式不兼容,我尝试使用str(text_photo)和.decode,但不起作用json_data = json.loads(rawData)

1 个答案:

答案 0 :(得分:0)

我无法理解您特定问题的所有详细信息,但我很确定根本原因是:

Python 3区分两种字符串类型strbytes,它们相似但不兼容。

一旦您了解了这意味着什么,它们各自可以做什么/不能做什么,以及如何相互转换,那么我确定您可以弄清楚如何正确构造API调用的URL。

不同类型,不兼容:

>>> type('abc'), type(b'abc')
(<class 'str'>, <class 'bytes'>)

>>> 'abc' + b'abc'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not bytes

>>> b'abc' + 'abc'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat str to bytes

如果要合并它们,则需要将所有内容转换为相同类型。 为了进行转换,将str编码为bytes,将bytes解码为str

>>> 'abc'.encode()
b'abc'
>>> b'abc'.decode()
'abc'

str.encodebytes.decode方法采用可选的encoding=参数,默认为UTF-8。 此参数定义str中的字符和bytes对象中的八位字节之间的映射。 如果使用给定的编码将字符映射到字节时遇到问题,则会遇到UnicodeEncodeError。 如果您使用给定映射中未定义的字符,则会发生这种情况:

>>> '5 £'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 2: ordinal not in range(128)

类似地,如果某些文本已使用编码X进行编码,但是您尝试使用编码Y对其进行解码,则可能会看到UnicodeDecodeError

>>> b = '5 £'.encode('utf8')
>>> b
b'5 \xc2\xa3'
>>> b.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 2: ordinal not in range(128)

您可以使用errors="ignore"策略避免出现异常,但是您将通过以下方式丢失信息:

>>> '5 £'.encode('ascii', errors='ignore')
b'5 '

通常,如果使用文本,则在各处使用str。 您也不应该经常需要直接使用.encode/.decode;通常是文件处理程序等。接受str并将其转换为幕后的bytes

在您的情况下,您需要找出混合使用strbytes的位置和原因,然后在连接之前确保所有类型都具有相同的类型。