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

时间:2017-09-17 00:29:14

标签: 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

问题在于for for循环:

outtweets = [(tweet.text.encode("utf-8") + " ") for tweet in alltweets]

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

1 个答案:

答案 0 :(得分:0)

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

您正在尝试将字节字符串(基本上是不可变字符数组)与unicode字符串组合在一起。这不能(轻松)完成。

您的代码段中的问题是,使用encode方法将推文文本(很可能是字符串)转换为字节。这很好,但是当您尝试将空格" "(这是一个字符串)连接到bytes对象时,会发生错误。您可以删除encode并将串联作为字符串(稍后可能编码)或通过在引号之前添加“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

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

我猜你的问题,最简单的解决方案是将空格设为字节串。我希望这会有所帮助。