字典键不能编码为utf-8

时间:2016-10-19 09:44:42

标签: python python-2.7 encoding utf-8 tweepy

我使用twitter流式api(tweepy)来捕获几条推文。我在python2.7中这样做。

在收集推文语料库后,我将每条推文分成单词,并将每个单词作为键添加到词典中,其中值是positivenegative句中每个单词的参与。

当我检索单词作为字典的键并尝试处理它们以进行下一次迭代时,我得到了

  

UnicodeDecodeError:'ascii'编解码器无法解码位置2中的字节0xe2:序数不在范围内(128)

错误

奇怪的是,在我将它们作为字典键放置之前,我对它们进行了编码而没有错误。这是一个示例代码

pos = {}
neg = {}
for status in corpus:
    p = s.analyze(status).polarity
    words = []
    # gather real words
    for w in status.split(' '):
        try:
            words.append(w.encode('utf-8'))
        except UnicodeDecodeError as e:
            print(e)
    # assign sentiment of the sentence to the words
    for w in words:
        if w not in pos:
            pos[w] = 0
            neg[w] = 0

        if p >= 0:                    
            pos[w] += 1
        else:
            neg[w] += 1

k = pos.keys()
k = [i.encode('utf-8') for i in k]  # <-- for this line a get an error
p = [v for i, v in pos.items()]
n = [v for i, v in neg.items()]

因此,这段代码在分割单词期间不会捕获任何错误,但在尝试再次对密钥进行编码时会引发错误。我应该注意,通常我不会再尝试对密钥进行编码,因为我认为它们已经被正确编码了。但我添加了这个额外的编码来缩小错误的来源。

我错过了什么吗?你看到我的代码有什么问题吗?

为了避免混淆,这里的示例代码更接近原始版本,而不是再次尝试对密钥进行编码

k = ['happy']
for i in range(3):
    print('sampling twitter --> {}'.format(i))
    myStream.filter(track=k)  # <-- this is where I will receive the error in the second iteration
    for status in corpus:
        p = s.analyze(status).polarity
        words = []
        # gather real words
        for w in status.split(' '):
            try:
                words.append(w.encode('utf-8'))
            except UnicodeDecodeError as e:
                print(e)
        # assign sentiment of the sentence to the words
        for w in words:
            if w not in pos:
                pos[w] = 0
                neg[w] = 0

            if p >= 0:                    
                pos[w] += 1
            else:
                neg[w] += 1

    k = pos.keys()

请为问题提出更好的标题

2 个答案:

答案 0 :(得分:1)

请注意,错误消息显示“'ascii'编解码器无法解码 ...”。那是因为当你在Python 2中已经是字节串的东西上调用encode时,它会尝试使用默认编解码器将其解码为Unicode。

我不确定为什么你认为再次编码会是一个好主意。不要这样做;字符串已经被字符串所保留,就像那样。

答案 1 :(得分:1)

当您尝试编码字符串时,会出现解码错误。这看起来很奇怪,但这是由于Python的隐式解码/编码机制。

Python允许对字符串进行编码以获取字节并解码字节以获取字符串。这意味着Python只能编码字符串并只解码字节。

因此,当您尝试编码字节时,Python(不知道如何编码字节)会尝试隐式解码字节以获取要编码的字符串,并使用其默认编码来执行此操作。 这就是为什么在尝试编码时会出现解码错误的原因:隐式解码。

这意味着您可能正在尝试编码已编码的内容。