[英]Dictionary keys cannot be encoded as utf-8
我正在使用Twitter流API(tweepy)捕獲多個tweet。 我在python2.7中做到這一點。
收集了一系列推文之后,我將每個推文分解成多個單詞,並將每個單詞添加到字典中作為鍵,其中的值是每個單詞在positive
或negative
句子中的參與度。
當我檢索單詞作為字典的鍵並嘗試對其進行下一次迭代處理時,我得到
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.