Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Июль 6, 2007 06:24:11

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 443
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

всем привет

есть код
a,c = 32, “”.decode('cp1251')
while a < 256:
print “%s %s”%(a,chr(a))
c = c+“%s”%(chr(a))
a = a+1
print c

исполняется с ошибкой
(начало вырезано)
127 
128 Ђ
Traceback (most recent call last):
File “C:\Python25\test.py”, line 6, in <module>
c = c+“%s”%(chr(a))
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0x80 in position 0: ordinal not in range(128)
>>>

подскажите как исправить ошибку.
Большое спасибо



Офлайн

#2 Июль 6, 2007 10:02:46

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

заменить
a,c = 32, “”.decode('cp1251')
на
a,c = 32, “”



Офлайн

#3 Июль 6, 2007 11:14:14

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 443
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

но в таком случае получаем вывод
252 ь
253 э
254 ю
255 я
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

а мне нужны символы кириллицы, которые отсутствуют в последней строке (print c).
как их получить?

P.S. начинал я с кода который предлагаете вы, но отсутствие символов кириллицы (print c) сподвигло меня на поиски приключений, которые еще продолжаются :)



Отредактировано (Июль 6, 2007 11:16:19)

Офлайн

#4 Июль 6, 2007 11:31:53

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 443
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

нашел решение

a,c = 32, “”
while a < 256:
print “%s %s”%(a,chr(a))
c = c+“%s”%(chr(a))
a = a+1
print c.decode('cp866')

странно но print c.decode('cp1251'), print c.decode('utf-8') в винде приводит к ошибке преобразования кодировки.



Отредактировано (Июль 6, 2007 12:13:51)

Офлайн

#5 Июль 6, 2007 12:03:52

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

qman
нашел решение

a,c = 32, “”
while a < 256:
print “%s %s”%(a,chr(a))
c = c+“%s”%(chr(a))
a = a+1
print c.decode('cp866')
это не решение – это жест отчаяния.

странно но print c.decode('cp1251'), print c.decode('utf-8') в винде приводит к ошибке преобразования кодировки.
для начала неплохо разобраться где и как обстоит дело с кодировками, и в чем разница между decode и encode.

Получается что python работает в винде как консольное приложение? т.к. использует cp866
верно. python.exe – консольная прога, pythonw.exe – GUI-запускалка, работает без присоединенной консоли.

Только использование cp866 – это второстепенное следствие. И не консольной природы python.exe, а того факта, что консоль в русской винде имеет кодировку cp866. У американцев это будет cp430, у арабов cp720 или типа того, у японцев… черт, не знаю какая консоль у японцев.

Кстати, кодировка консоли переключается командой chcp. И можно включить в принципе любую кодировку. Особенно если еще при этом для консоли выбрать в настройках юникодный шрифт (Lucida Console).



Офлайн

#6 Июль 6, 2007 12:10:09

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 443
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

bialix
тогда почему в цикле while и после окончания цикла одному и тому номеру соответствуют разные символы?
Такое утверждение я сделал из за того что переменную “c” приходится делать decode('cp866') а символ отображается без соответствующий номеру “a” .



Офлайн

#7 Июль 6, 2007 14:01:01

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

qman
bialix
тогда почему в цикле while и после окончания цикла одному и тому номеру соответствуют разные символы?
Такое утверждение я сделал из за того что переменную “c” приходится делать decode('cp866') а символ отображается без соответствующий номеру “a” .
нифига не понял.

функция chr превращает байт в строку единичной длины, символ которой полностью соответствует этому байту.
Поэтому chr(0x80) == “\x80”

Далее.
Вы могли бы увидеть реальные коды в строке c делая
print repr©

Тогда бы вы получили нечто такое:


>>> c = “”.join()
>>> print repr©
' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x
86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\x
a6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\x
c6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\x
e6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'


Теперь вернемся к вашему исходному коду.

1) Я не понимаю, что вы хотите сделать
2) Если работать в консоли, то мое решение нормально печатает все символы строки в виде тех символов, которым соответствуют коды символов в кодировке CP866. Вот:


>>> print c
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~&#8962;АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдежзийклмноп&#9617;&#9618;&#9619;&#9474;&#9508;&#9569;&#9570;&#9558;&#9557;&#9571;&#9553;&#9559;&#9565;&#9564;&#9563;&#9488;&#9492;&#9524;&#9516;&#9500;&#9472;&#9532;&#9566;&#9567;&#9562;&#9556;&#9577;&#9574;&#9568;&#9552;&#9580;&#9575;&#9576;&#9572;&#9573;&#9561;&#9560;&#9554;&#9555;&#9579;&#9578;&#9496;&#9484;&#9608;&#9604;&#9612;&#9616;&#9600;рстуфхцчшщъыьэюяЁёЄєЇїЎў°&#8729;·&#8730;№¤&#9632;


3) Ваш исходный код c = c+“%s”%(chr(a)) падает, когда начальное значение с равно юникодной строке, вот здесь вы делаете пустую юникодную строку: “”.decode('cp1251'). Кстати, так можно было не извращаться, достаточно было написать c = u“”

4) Почему падает ваш начальный код при попытке конвертировать символ символ с кодом 128 в юникод?
В traceback причина написана: ‘ascii’ codec can't decode byte 0x80 in position 0: ordinal not in range(128)
Перевожу на русский: ‘ascii’ кодек не может декодировать байт 0x80 в позиции 0: значение не в диапазоне range(128)

На всякий случай напомню, что кодировка ASCII определяет только символы с кодами от 1 до 127 включительно.

5) На всякий случай – range() – это функция порождающая список целых чисел:


>>> range(128)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 3
4, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 6
6, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 9
8, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 1
24, 125, 126, 127]


Таким образом сообщение об ошибке говорит вам, что ascii-кодек может преобразовать только символы, чьи коды лежат внутри списка range(128)

6) При печати обычной (не-юникодной строки) на экран она выводится как есть, а на экране отображается самой консолью, с использованием тех шрифтов и той кодировки, которая присуща самой консоли. К питону это не имеет никакого отношения.

7) Чтобы узнать кодировку консоли можно воспользоваться таким кодом:


>>> import sys
>>> sys.stdout.encoding
'cp866'


Если я переключу кодировку консоли при помощи команды виндовс-консоли chcp 1251, а потом запущу питон и снова спрошу кодировку консоли, то в ответ увижу ‘cp1251’. Все честно.

8) Когда вам нужно напечатать некоторую юникодную строку на экране, то можно понадеяться на опреатор print либо перекодировать ее в не-юникод самостоятельно.

9) Когда вы передаете оператору print юникод-строку, которую надо напечатать, то питон сначала пытается перекодировать ее в обычную строку, используя кодек, соответствующий кодировке консоли (см. п.7). Если это невозможно, потому что ваша юникод-строка содержит символы, которые невозможно отобразить в данной кодировке консоли, вы получаете UnicodeEncodeError.

10) Когда вы конвертируете строку из юникода в обычный вид перед тем как напечатать, то используете метод encode юникодной строки:

s = u.encode('cp866')

При этом опять же можно поймать UnicodeEncodeError, если кодировка была выбрана неправильно. Но можно подавить эту ошибку, предложив кодеку заменять “неверные” символы вопросиками:

s = u.encode('cp1251', replace)

Обо всем этом можно попробовать почитать в справке к питону, см. раздел по модулю codecs.



Офлайн

#8 Апрель 24, 2013 15:29:06

dm1tri1
От: Санкт-Петербург
Зарегистрирован: 2013-04-24
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

Добрый день!
Столкнулся с такой же проблемой, но при работе со словарем Стемминга. Задача была извлечь корень из русского слова, благо словарь поддерживает, но сам компилятор ругается: UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xef in position 0: ordinal not in range(128)

Сам код:

from nltk.stem import SnowballStemmer
russian_stemmer = SnowballStemmer('russian')
russian_stemmer.stem('приветственный')

Буду рад Вашей помощи!

Офлайн

#9 Апрель 24, 2013 16:05:35

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 417
Репутация: +  41  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

юзай python3 или делай так

#coding: utf-8
from nltk.stem import SnowballStemmer
russian_stemmer = SnowballStemmer('russian')
russian_stemmer.stem(u'приветственный')




pyramid | hy

Отредактировано bismigalis (Апрель 24, 2013 16:06:05)

Офлайн

#10 Апрель 24, 2013 16:14:22

dm1tri1
От: Санкт-Петербург
Зарегистрирован: 2013-04-24
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position

Всё равно появляется ошибка, полный ее текст:

Traceback (most recent call last):
  File "C:/Python27/123", line 4, in <module>
    russian_stemmer.stem('приветственный')
  File "C:\Python27\lib\site-packages\nltk\stem\snowball.py", line 3023, in stem
    rv, r2 = self.__regions_russian(word)
  File "C:\Python27\lib\site-packages\nltk\stem\snowball.py", line 3194, in __regions_russian
    word = (word.replace(u"i^a", u"A")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version