簡體   English   中英

字典鍵不能編碼為utf-8

[英]Dictionary keys cannot be encoded as utf-8

我正在使用Twitter流API(tweepy)捕獲多個tweet。 我在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()

請為這個問題建議一個更好的標題

請注意,錯誤消息顯示“'ascii'編解碼器無法解碼 ...”。 這是因為當您在Python 2中已經對字節字符串encode時,它將嘗試首先使用默認編解碼器將其解碼為Unicode。

我不確定您為什么認為再次編碼將是一個好主意。 不要做 字符串已經是byetestrings,就這樣吧。

嘗試編碼字符串時收到解碼錯誤。 這似乎很奇怪,但這是由於Python的隱式解碼/編碼機制所致。

Python允許對字符串進行編碼以獲得字節,而對字節進行解碼以獲得字符串。 這意味着Python只能編碼字符串,而只能解碼字節。

因此,當您嘗試對字節進行編碼時,Python(不知道如何對字節進行編碼)會嘗試隱式地對字節進行解碼以獲得要編碼的字符串,並使用其默認編碼來做到這一點。 這就是為什么在嘗試對某些內容進行編碼時會發生解碼錯誤的原因:隱式解碼。

這意味着您可能正在嘗試對已經編碼的內容進行編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM