我试图将我的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]
我试过改变编码来完全解码或删除编码参数,但我无法弄清楚。任何帮助将不胜感激。
答案 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 '
我猜你的问题,最简单的解决方案是将空格设为字节串。我希望这会有所帮助。