Ошибка UnicodeDecodeError на Python: кодек ‘ascii’ не может декодировать байт 0xe2 в позиции 0: порядковый номер не находится в диапазоне (128)

#python #tkinter

#python #tkinter

Вопрос:

У меня есть следующий код:

 # -*- coding: utf-8 -*-

forbiddenWords=['for', 'and', 'nor', 'but', 'or', 'yet', 'so', 'not', 'a', 'the', 'an', 'of', 'in', 'to', 'for', 'with', 'on', 'at', 'from', 'by', 'about', 'as']


def IntoSentences(paragraph):
    paragraph = paragraph.replace("–", "-")
    import nltk.data
    sent_detector = nltk.data.load('tokenizers/punkt/english.pickle')
    sentenceList = sent_detector.tokenize(paragraph.strip())
    return sentenceList

from Tkinter import *

root = Tk()

var = StringVar()
label = Label( root, textvariable=var)
var.set("Fill in the caps: ")
label.pack()

text = Text(root)
text.pack()

button=Button(root, text ="Create text with caps.", command = IntoSentences(text.get(1.0,END)))
button.pack()

root.mainloop()
  

Когда я пытаюсь запустить этот код, я получаю следующую ошибку:

 C:UsersIndrek>C:Python27Myprojectscaps_main.py
Traceback (most recent call last):
  File "C:Python27Myprojectscaps_main.py", line 25, in <module>
    button=Button(root, text ="Create text with caps.", command = IntoSentences(
text.get(1.0,END)))
  File "C:Python27Myprojectscaps_main.py", line 7, in IntoSentences
    paragraph = paragraph.replace("ŌĆō", "-")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal
not in range(128)
  

В чем здесь проблема? Я провел некоторые исследования по этой проблеме, но сообщения, которые я прочитал, мне не помогли. Что я должен изменить в своем конкретном коде?

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

1. Вы уверены, что это правильная ошибка? Я не могу его воспроизвести и не могу найти способ достаточно запутать кодировки, чтобы эмулировать его. Если уж на то пошло, вы уверены, что файл сохранен в UTF8?

2. Да, я проверил, это правильная ошибка, и я уверен, что она сохранена в utf-8, что я должен сделать, чтобы быть абсолютно уверенным?

3. Выполнить print(repr(open(filename, "rb"))) . Предоставьте нам (желательно обрезанный) вывод.

4. Когда я пытаюсь запустить это в cmd, я получаю следующее сообщение: невозможно инициализировать PRN устройства

5. Вы запускали это в оболочке Python, да?

Ответ №1:

Моя ошибка заключалась в неправильном использовании command, как и сказал Брайан Оукли. Теперь мой код следует, и все работает:

 # -*- coding: utf-8 -*-

forbiddenWords=['for', 'and', 'nor', 'but', 'or', 'yet', 'so', 'not', 'a', 'the', 'an', 'of', 'in', 'to', 'for', 'with', 'on', 'at', 'from', 'by', 'about', 'as']


def IntoSentences(paragraph):
    paragraph = paragraph.replace("–", "-")
    import nltk.data
    sent_detector = nltk.data.load('tokenizers/punkt/english.pickle')
    sentenceList = sent_detector.tokenize(paragraph.strip())
    return sentenceList

def new_sentences(sentenceList):
    for i in sentenceList:
        import re
        from random import randint
        s6nade_arv=len(lause.split(' '))
        while True:
            asendatava_idx=randint(0,s6nade_arv-1)
            wordList = re.sub("[^w]", " ",  lause).split()
            asendatav_s6na=wordList[asendatava_idx]
            if asendatav_s6na.lower() not in forbiddenWords:
                break
        uus_lause=lause.replace(asendatav_s6na, "______")
        new_sentences.append(uus_lause)

from Tkinter import *

root = Tk()

var = StringVar()
label = Label( root, textvariable=var)
var.set("Fill in the caps: ")
label.pack()

text = Text(root)
text.pack()

button=Button(root, text ="Create text with caps.", command =lambda: IntoSentences(text.get(1.0,END)))
button.pack()

root.mainloop()
  

Что я изменил, так это добавил лямбда: в button=Button(root, text ="Create text with caps.", command =lambda: IntoSentences(text.get(1.0,END)))