无法将字节连接到 str(转换为 Python3)

mas*_*c15 1 python python-3.x

我正在尝试将 Python 2 代码转换为 Python3,但收到以下错误:

Traceback (most recent call last):
  File "markovtest.py", line 73, in <module>
    get_all_tweets("quit_cryan")
  File "markovtest.py", line 41, in get_all_tweets
    outtweets = [(tweet.text.encode("utf-8") + str(b" ")) for tweet in alltweets]
  File "markovtest.py", line 41, in <listcomp>
    outtweets = [(tweet.text.encode("utf-8") + str(b" ")) for tweet in alltweets]
TypeError: can't concat bytes to str
Run Code Online (Sandbox Code Playgroud)

问题在于这个 for 循环:

outtweets = [(tweet.text.encode("utf-8") + " ") for tweet in alltweets]
Run Code Online (Sandbox Code Playgroud)

我曾尝试更改编码以解码或完全删除编码参数,但我无法弄清楚。任何帮助,将不胜感激。

m00*_*0am 7

Python3 有几种不同的“字符串”类型。可以在此处找到有关有哪些以及它们应该做什么的详细信息。

您正在尝试将一个字节字符串(基本上是一个不可变的字符数组)组合到一个 unicode 字符串中。这不能(很容易)做到。

您的代码片段中的问题是推文文本(很可能是字符串)使用该encode方法转换为字节。这工作正常,但是当您尝试将空格" "(这是一个字符串)连接到字节对象时,就会发生错误。您可以删除 theencode并将其作为字符串进行连接(并且可能稍后进行编码),或者通过在这样的引号之前添加一个 'b' 来使空间成为一个字节对象b" "

让我们来看看您的选择:

In [1]: type("foo")
Out[1]: str

In [2]: type("foo".encode("utf-8"))
Out[2]: bytes

In [3]: "foo" + " "  # str + str
Out[3]: 'foo '

In [4]: "foo".encode("utf-8") + " "  # str + bytes
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-5c7b745d9739> in <module>()
----> 1 "foo".encode("utf-8") + " "

TypeError: can't concat bytes to str
Run Code Online (Sandbox Code Playgroud)

我想对于您的问题,最简单的解决方案是将空间设为字节字符串(如下所示)。我希望这有帮助。

In [5]: "foo".encode("utf-8") + b" "  # bytes + bytes
Out[5]: b'foo '
Run Code Online (Sandbox Code Playgroud)