Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.51.5] |
|
Сообщ.
#1
,
|
|
|
Собственно, получаю ошибку в закоментированной строке (если ее раскоментировать):
# -*- coding: UTF-8 -*- import codecs f = codecs.open('utf-8.txt', 'r','utf-8') strings ='' for line in f: strings+=line f.close() s = strings.replace(' ','') #это-то работает! #s = strings.replace('помощь','все') #UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128) print s Содержание файла: Цитата Привет жителям сорцов! Заранее спасибо за помощь. Как заставить код работать? Прикреплённый файл_utf_8FileOpen.py (372 байт, скачиваний: 287) Прикреплённый файлutf_8.txt (94 байт, скачиваний: 298) Добавлено Собственно, нашел два решения проблемы, но я их не понимаю s = strings.replace('помощь'.decode('utf-8'),'все'.decode('utf-8')) #работает 8[ ] s = strings.encode('utf-8').replace('помощь','все').decode('utf-8') #Девид Блейн! И это работает! 8[ ] Кто-нибудь может объяснить на пальцах, что происходит? Как вы понимаете описание? С одной строны питон нетипизованный язык, с другой стороны я что-то куда-то кодирую ибо он не справляется. Что куда кодируется? В каком виде (тип переменной, геометрический смысл) строка, считанная из файла, открытого командой codecs.open('utf-8.txt', 'r','utf-8') В каком виде строка, которая в коде объявлена так: # -*- coding: UTF-8 -*- s = 'Полный привет' Скрытый текст Много чего гуглится по теме, но не очень понятно что проиходит http://stackoverflow.com/questions/1040613...ition-2-ordinal |
Сообщ.
#2
,
|
|
|
Цитата ttiger @ Много чего гуглится по теме, но не очень понятно что проиходит Да собственно как раз из твоей ссылки и понятно, что происходит: Цитата Unicode is not equal to UTF-8. The latter is just an encoding for the former. Наш питон - крутой и продвинутый язык, посему работает внутри себя в юникоде. А мы должны соответствовать. Я тоже с этим долго парился, потому что база у меня на cp-1251, а всякие веб-сервисы внешние хотят utf-8, и мне казалось что перекодируй я свою виндовую кодировку в юникод - и всё будет прекрасно. С помощью unicode.decode Но нет, ни фига не работало... пока я не допёр, что это всё-таки разные кодировки. В итоге я написал такую конструкцию, которой до сих пор пользуюсь: unicode.encode(unicode(str(s), 'cp1251'), 'utf8') То есть я свою строку s кодирую в юникод из cp1251, а потом полученную кракозяблу - раскодирую в utf8. Твои примеры работают по тому же принципу... А первый код не работал потому, что сам файл у тебя в UTF-8 кодировке, и файл с текстом, и текст, который ты захардкодил - тоже в UTF-8, а должен был быть в юникоде. Более того, даже если бы ты написал в файле английский текст - всё бы заработало, а с русским - нет. |
Сообщ.
#3
,
|
|
|
Цитата Dark_Sup @ Более того, даже если бы ты написал в файле английский текст - всё бы заработало, а с русским - нет. В этом, кстати, основная проблема. Англоязычные руководства к библиотекам с такими вещами часто не парятся. Тот же NLTK мало содержит инструкций. Добавлено Кстати, хардкоженные строки патона и в третьем и по стором юникодовые? А что понимает питон под кодировкой? # -*- coding: UTF-8 -*- |
Сообщ.
#4
,
|
|
|
По-моему это кодировка самого файла с текстом программы... он же не компилируемый язык, и каждый раз при изменении по строчкам снова фигачит.
По крайней мере если я эту кодировку не указываю, он у меня доходит до первого русского слова в программе и падает. Цитата ttiger @ В этом, кстати, основная проблема. Англоязычные руководства к библиотекам с такими вещами часто не парятся. Тот же NLTK мало содержит инструкций. Ну да. Впрочем, если бы все уже давно и окончательно перешли бы на чистый юникод, то такие проблемы действительно отпали бы навсегда... но когда это случится я даже не представляю. Уже десять лет жду, но куда ни прихожу - говорят "пиши для Win1251, у нас так издавна принято". И ведь действтительно, не будешь же перелопачивать весь код, написанный с 1992-го года! |
Сообщ.
#5
,
|
|
|
Речь идет о Python 2 или Python 3?
|
Сообщ.
#6
,
|
|
|
Цитата Мяут-Настоящий @ Я использовал двойку. Речь идет о Python 2 или Python 3? |
Сообщ.
#7
,
|
|
|
Ну тогда все относительно просто.
Есть тип str - внутреннее представление - тупо набор байт. Соответственно, для разных операций (в т.ч. замены), нужно его декодировать в строку (набор букв). А так как в кодеке ASCII нет буквы 'п' оно не ругается. Есть тип unicode - там все буквы - 16-битные из UCS-2. Соответственно таких проблем с промежуточным кодированием/декодированием нет. В Python 3 unicode вытеснил тип str |
Сообщ.
#8
,
|
|
|
Цитата Мяут-Настоящий @ Есть тип str - внутреннее представление - тупо набор байт. Соответственно, для разных операций (в т.ч. замены), нужно его декодировать в строку (набор букв). А так как в кодеке ASCII нет буквы 'п' оно не ругается. А ты можешь мой пример переделать с использованием str? |
Сообщ.
#9
,
|
|
|
У тебя и есть str. Чтобы использовать unicode, нужно писать u перед строковыми литералами:
u'Юникод' ну и тип unicode везде пихать |
Сообщ.
#10
,
|
|
|
Цитата Мяут-Настоящий @ В Python 3 unicode вытеснил тип str Получается, в 3 питоне тот код будет работать вообще без плясок с бубном? Все строки будут юникодовыми и всё? |