Ключи словаря не могут быть закодированы как utf-8

#python #python-2.7 #encoding #utf-8 #tweepy

#python #python-2.7 #кодирование #utf-8 #tweepy

Вопрос:

Я использую потоковый API Twitter (tweepy) для записи нескольких твитов. Я делаю это в python2.7.

После того, как я собрал корпус твитов, я разбиваю каждый твит на слова и добавляю каждое слово в словарь в виде ключей, где значения представляют собой участие каждого слова в positive или negative предложениях.

Когда я извлекаю слова как ключи словаря и пытаюсь обработать их для следующей итерации, я получаю

Ошибка UnicodeDecodeError: кодек ‘ascii’ не может декодировать байт 0xe2 в позиции 2: порядковый номер не входит в диапазон (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()
  

(пожалуйста, предложите лучшее название вопроса)

Комментарии:

1. Почему вы кодируете () закодированное значение? Вы хотели это расшифровать?

2. Что, если вы w.encode (‘ascii’) в первый раз? Устраняет ли это ошибку?

3. Как я и подозревал tweepy , по умолчанию кодируются термины дорожки, отсюда и ошибка

Ответ №1:

При попытке кодирования строки вы получаете ошибку декодирования. Это кажется странным, но это связано с неявным механизмом декодирования / кодирования Python.

Python позволяет кодировать строки для получения байтов и декодировать байты для получения строк. Это означает, что Python может кодировать только строки и декодировать только байты.

Поэтому, когда вы пытаетесь закодировать байты, Python (который не знает, как кодировать байты) пытается неявно декодировать байт, чтобы получить строку для кодирования, и для этого он использует кодировку по умолчанию. Вот почему вы получаете ошибку декодирования при попытке что-либо закодировать: неявное декодирование.

Это означает, что вы, вероятно, пытаетесь закодировать что-то, что уже закодировано.

Комментарии:

1. Во втором фрагменте я не пытаюсь снова кодировать слова, возможно, tweepy пытается закодировать начальное значение по умолчанию

Ответ №2:

Обратите внимание, что в сообщении об ошибке говорится «кодек ‘ascii’ не может декодировать …». Это потому, что когда вы вызываете encode что-то, что уже является байтовой строкой в Python 2, оно пытается сначала декодировать его в Unicode, используя кодек по умолчанию.

Я не уверен, почему вы подумали, что повторное кодирование было бы хорошей идеей. Не делайте этого; строки уже являются byetestrings, оставьте их такими.

Комментарии:

1. Дэниел, я обновил вопрос. Пожалуйста, посмотрите, я явно не пытаюсь перекодировать строку encodes. Но теперь, когда вы упомянули об этом, возможно, tweepy обработчик потоковой передачи пытается (?) Я проверю это

2. Вам нужно будет опубликовать полную обратную трассировку, чтобы мы могли видеть, где возникает ошибка.