На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
Модераторы: RaD
  
    > [python] [nltk]Как работать со строками юникода?
      Собственно, получаю ошибку в закоментированной строке (если ее раскоментировать):

      ExpandedWrap disabled
        # -*- 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)

      Добавлено
      Собственно, нашел два решения проблемы, но я их не понимаю

      ExpandedWrap disabled
        s = strings.replace('помощь'.decode('utf-8'),'все'.decode('utf-8')) #работает 8[ ]
        s = strings.encode('utf-8').replace('помощь','все').decode('utf-8') #Девид Блейн! И это работает! 8[ ]



      Кто-нибудь может объяснить на пальцах, что происходит? Как вы понимаете описание? С одной строны питон нетипизованный язык, с другой стороны я что-то куда-то кодирую ибо он не справляется.
      Что куда кодируется?
      В каком виде (тип переменной, геометрический смысл) строка, считанная из файла, открытого командой
      ExpandedWrap disabled
        codecs.open('utf-8.txt', 'r','utf-8')
      ?

      В каком виде строка, которая в коде объявлена так:
      ExpandedWrap disabled
        # -*- coding: UTF-8 -*-
        s = 'Полный привет'
      ?

      Скрытый текст
      Много чего гуглится по теме, но не очень понятно что проиходит
      http://stackoverflow.com/questions/1040613...ition-2-ordinal
      Сообщение отредактировано: ttiger -
        Цитата ttiger @
        Много чего гуглится по теме, но не очень понятно что проиходит

        Да собственно как раз из твоей ссылки и понятно, что происходит:
        Цитата
        Unicode is not equal to UTF-8. The latter is just an encoding for the former.


        Наш питон - крутой и продвинутый язык, посему работает внутри себя в юникоде. А мы должны соответствовать.
        Я тоже с этим долго парился, потому что база у меня на cp-1251, а всякие веб-сервисы внешние хотят utf-8, и мне казалось что перекодируй я свою виндовую кодировку в юникод - и всё будет прекрасно. С помощью unicode.decode
        Но нет, ни фига не работало... пока я не допёр, что это всё-таки разные кодировки.

        В итоге я написал такую конструкцию, которой до сих пор пользуюсь:
        ExpandedWrap disabled
          unicode.encode(unicode(str(s), 'cp1251'), 'utf8')


        То есть я свою строку s кодирую в юникод из cp1251, а потом полученную кракозяблу - раскодирую в utf8. Твои примеры работают по тому же принципу...
        А первый код не работал потому, что сам файл у тебя в UTF-8 кодировке, и файл с текстом, и текст, который ты захардкодил - тоже в UTF-8, а должен был быть в юникоде.

        Более того, даже если бы ты написал в файле английский текст - всё бы заработало, а с русским - нет.
          Цитата Dark_Sup @
          Более того, даже если бы ты написал в файле английский текст - всё бы заработало, а с русским - нет.

          В этом, кстати, основная проблема. Англоязычные руководства к библиотекам с такими вещами часто не парятся.
          Тот же NLTK мало содержит инструкций.

          Добавлено
          Кстати, хардкоженные строки патона и в третьем и по стором юникодовые?
          А что понимает питон под кодировкой?

          ExpandedWrap disabled
            # -*- coding: UTF-8 -*-
            По-моему это кодировка самого файла с текстом программы... он же не компилируемый язык, и каждый раз при изменении по строчкам снова фигачит.

            По крайней мере если я эту кодировку не указываю, он у меня доходит до первого русского слова в программе и падает.


            Цитата ttiger @
            В этом, кстати, основная проблема. Англоязычные руководства к библиотекам с такими вещами часто не парятся.
            Тот же NLTK мало содержит инструкций.

            Ну да. Впрочем, если бы все уже давно и окончательно перешли бы на чистый юникод, то такие проблемы действительно отпали бы навсегда... но когда это случится я даже не представляю. Уже десять лет жду, но куда ни прихожу - говорят "пиши для Win1251, у нас так издавна принято". И ведь действтительно, не будешь же перелопачивать весь код, написанный с 1992-го года!
              Речь идет о Python 2 или Python 3?
                Цитата Мяут-Настоящий @
                Речь идет о Python 2 или Python 3?
                Я использовал двойку.
                  Ну тогда все относительно просто.

                  Есть тип str - внутреннее представление - тупо набор байт. Соответственно, для разных операций (в т.ч. замены), нужно его декодировать в строку (набор букв). А так как в кодеке ASCII нет буквы 'п' оно не ругается.

                  Есть тип unicode - там все буквы - 16-битные из UCS-2. Соответственно таких проблем с промежуточным кодированием/декодированием нет.

                  В Python 3 unicode вытеснил тип str :)
                    Цитата Мяут-Настоящий @
                    Есть тип str - внутреннее представление - тупо набор байт. Соответственно, для разных операций (в т.ч. замены), нужно его декодировать в строку (набор букв). А так как в кодеке ASCII нет буквы 'п' оно не ругается.

                    А ты можешь мой пример переделать с использованием str?
                      У тебя и есть str. Чтобы использовать unicode, нужно писать u перед строковыми литералами:
                      ExpandedWrap disabled
                        u'Юникод'

                      ну и тип unicode везде пихать :)
                        Цитата Мяут-Настоящий @
                        В Python 3 unicode вытеснил тип str :)

                        Получается, в 3 питоне тот код будет работать вообще без плясок с бубном? Все строки будут юникодовыми и всё?
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0395 ]   [ 16 queries used ]   [ Generated: 13.05.24, 08:02 GMT ]