Пользователь
0,0
рейтинг
24 июля 2008 в 00:59

Разработка → Основы Python — кратко. Строки.

Поскольку число положительных отзывов превысило число отрицательных, продолжу выкладывание уроков. Те кто уже знаком с основами — можете или просто пропустить урок, или попробовать сделать задание 3 самым коротким способом :)

Для начала маленькое замечание.

Начиная с Python 2.3, всем, кто использует не-ASCII кодировку нужно добавлять указание о кодировке в самом начале программы. Для русского языка это будет в основном:
# -*- coding: cp1251 -*-

или использовать для хранения исходных текстов файлы utf-8 (что предпочтительней).

Изучив управление числами, пришла пора осваивать строки. Пайтон обладает весьма богатым набором возможностей в этой области.

Строки


Строки могут быть заключены в одинарные или двойные кавычки, строки могут использовать esc-последовательности в стиле С, многострочные константы задаются в тройных кавычках.
>>> "habrahabr"
'habrahabr'
>>> 'foo bar boz'
'foo bar boz'
>>> "won't"
"won't"
>>> 'don"t'
'don"t'
>>> "couldn\"t"
'couldn"t'
>>> """multi line
... very long
... string constant"""
'multi line\nvery long\nstring constant'
>>> 'this takes \
... two lines'
'this takes two lines'

Строки можно склеивать оператором + и «размножать» оператором *
>>> "Hello "+"word"
'Hello word'
>>> "Hello "*3
'Hello Hello Hello '

По сути же своей строка представляет собой последовательность символов с произвольным доступом. Для получения части символов строки можно использовать т.н. оператор «среза». Обратите внимание, что нумерация начитается с нуля (и достаточно хаотична на первый взгляд).
>>> str = "Hello, cruel world!"
# получить 4 символ строки
>>> str[3] 
'l'
# все символы с 8 по 14
>>> str[7:14]
'cruel w'
# каждый второй символ со 2 по 13
>>> str[1:12:2]
'el,cul'
# некоторые значения можно опускать
# каждый второй символ строки.
>>> str[::2]
'Hlo re ol!'

Если опустить первый из трех параметров, он считается равным нулю, если опустить второй – срез будет продолжен до конца строки.
# первые 2 символа строки
>>> str[:2]
'He'
# вся строка кроме 2 первых символов
>>> str[2:]
'llo, cruel world!'

Срезы с неправильными границами обрабатываются следующим образом:
— если верхняя граница среза больше длины строки, то она уменьшается до длины строки
— если нижняя граница больше верхней, то возвращается пустая строка

Также срезы могут принимать отрицательные значения.
# последний символ
>>> str[-1]
'!' 
# второй символ с конца
>>> str[-2]
'd'
# два последних символа
>>> str[-2:]
'd!'
# все символы кроме последних двух
>>> str[:-2]
'Hello, cruel worl'

Лучший способ запомнить, как определяются индексы в срезе — считать их указывающими между символами, с номером 0 на левой границе первого символа. А правая граница последнего символа имеет индекс равный длине строки.
Для положительных символов длина строки равна разности между числами на границе.

Для определения длины строки используется функция len().

Unicode

В последних версиях Пайтон очень хорошо поддерживается работа с Unicode-строками.

Для задания unicode-строки в виде константы используется префикс u.
>>> uni = u"Тест"
>>> uni
u'\u0422\u0435\u0441\u0442'

Кроме того, Пайтон позволяет создать строку в Unicode с помощью одноименной функции.
>>> uni = unicode("Тест", "UTF-8")
>>> uni
u'\u0422\u0435\u0441\u0442'

Эта функция функция может работать с Latin-1, ASCII, UTF-8, UTF-16, с русскими кодировками ISO-8859-5, KOI8-R, CP1251, CP866 и Mac-cyrillic, и многими другими.

Для обратного преобразования служит метод encode, который преобразует unicode-строку в строку с заданной кодировкой.
>>> uni.encode("UTF-8")
'\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82'
>>> uni.encode("CP1251")
'\xd2\xe5\xf1\xf2'

Для преобразования строки в список по определенному разделителю, используется метод split.
Этот метод в качестве параметра запрашивает разделитель, а возвращает список отдельных «слов» по которому можно «пройти» в цикле for.
>>> str = "Mary has a little lamb"
>>> str.split(" ")
['Mary', 'has', 'a', 'little', 'lamb']
>>> for word in str.split(" "):
...     print word
...
Mary
has
a
little
lamb


Домашнее задание.

1. Написать программу, выводящую заданную пользователем строку как минимум в 3 разных кодировках. При этом писать вызов метода encode() в программе можно только 1 раз.
2. Написать программу поиска самого длинного слова в строке, разделенной пробелами.
3. (Повышенная сложность) Написать программу декодирования телефонного номера для АОН.
По запросу АОНа АТС посылает телефонный номер, используя следующие правила:
— Если цифра повторяется менее 2 раз, то это помеха и она должна быть отброшена
— Каждая значащая цифра повторяется минимум 2 раза
— Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий 2 или более подряд раз знак #

Например, входящая строка 4434###552222311333661 соответствует номеру 4452136
Кстати, регулярные выражения использовать в этих заданиях — нельзя :)
Павел Дмитриев @cleg
карма
149,8
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (108)

  • +1
    когда будете проверять домашнее задание? по какой шкале оценки?
    • 0
      когда вышлете его мне в личку, буду проверять. оценки - чисто для вас. бинарные. да-нет :)
  • 0
    Покажите как использовать len() на примере. Плз.
    • 0
      >>> a = '123456789'
      >>> print len(a)
      9
      • 0
        не помню, писали ли вы о версии питона в примерах. Но стоит указывать все же. Так как начав разбираться не сразу понял ошибки, оказалось что в версии 3 print уже функция и нужно писать print(len(a))
        • 0
          этой статье 2 года почти, в то время 3 пайтон еще был из области экзотики, надо же на это поправку делать.
          • 0
            да. извиняюсь, на дату не сразу посмотрел.
            Но вот я читал сегодня, а после меня придет новичек, скачает последнюю версию (3 или какую там потом) попробует пописать, не разберется, разозлится и плюнет на это дело. :) Можно просто пометить в статье, что примеры кода приведены для определенной версии языка.
            • 0
              Вот я пришол.
  • 0
    Неужели на хабре нет людей, которые пишут на Питоне? Автору статьи спасибо за развитие данного блога, но, ИМХО, перепечатывать книгу по Питону, которую каждый может скачать с официального сайта как-то не прилично.
    • +1
      Люди плюсуют - значит им нужно. ИМХО
      • –2
        Но есть кому и не надо О_О Но они почему-то молчат.
        • +2
          кому не надо правильно молчат
          зачем мешать другим получать знания
        • 0
          А когда планируется первый релиз РЯП ? :)
          Вы озвучили массу планов, столько всего интересного... ждем продолжения :)
          • 0
            Неужто кто-то еще помнит? :) Остатось еще немного. Первая IDE для РЯП выйдет как раз когда карму подниму :)
      • –2
        плюсует школие, выпросившее копейку кармы.
        надеюсь вы больше не будете засорять интернет мусором, перепечатывая материал из оригинальных источников.
        • 0
          Господи, кто бы говорил. Посмотрите на свою карму, а потом высказывайтесь так в чужую сторону. Бред...
        • 0
          см. мой ответ начавшему данную тему. остальное комментировать не буду.
    • 0
      я не перепечатываю книгу. просто про строки сказать много нечего. но пропустить нельзя. потому и получается похоже на оригинальную книгу.
      в принципе действительно получается отчасти некрасиво, потому я постараюсь в следующем посте собрать все ссылки на всю информацию на русском что есть.
      и кто не захочет читать мои "конспекты" сможет спокойно этого не делать.
      для тех же кому это полезно - пока продолжу. тем более что дальше темы будут все интереснее... :)
    • 0
      Есть.

      ИМХО пусть перепечатывает.
      Это возможность ознакомиться с праведной мощью Python для людей которые не хотят целенаправленно изучать его, но не прочь поглядеть новый язык.

      P.S. Устал ждать по 5 минут. Мысли появляются чаще, а пока сидишь выжидаешь часть из них забывается.
      • 0
        солидарен с Вами. Вот я по работе использую питон на начальном уровне - в основном как консольный парсер. Но книгу читать мне просто некогда (нет времени на это). А вот такие статейки я бы читал и потихонечку просвещался.

        Cleg - если надумаешь "закрывать" такие вот статьи - пости для друзей :) только не бросай
        • 0
          посмотрим...
        • 0
          вы читали притчу про дровосеков?
          оправдание, чтобы что-то не делать всегда найдется, а вы найдите оправдание чтобы сделать что-то.
          между прочим, чтение книги у вас заняло бы столько же времени, сколько чтение книги. плохому танцору всегда яйца мешают.
    • 0
      А что за книга?
      • 0
        книг несколько. постараюсь или сегодня в квечеру или завтра выложить пост со списком ссылок на все что есть по пайтону на русском.
        • 0
          Жду с нетерпением. Надеюсь в списке будет то чего нету портале питон-программистов http://python.su/forum/viewtopic.php?id=18
          • 0
            коллекцию литературы slav0nic-а я вряд ли переплюну :)
    • 0
      Есть, и думаю таких на Хабре немало.
      Например, у меня сейчас все раразработки идут на питоне. И чем дальше с ним работаю, тем больше нравится. Но я помню как сам когда-то начинал. И вот тут необычность питона как в синтаксисе, так и в логике создает некоторые проблемы, можно сказать «первоначальный барьер». Такие статьи как раз нужны новичкам, чтобы познакомить их с самим языком, показать базовые конструкции, как с этим работать, что этот язык однозначно стоит того, чтобы его освоить - окупится сторицей.
      В этом плане автор делает хорошее дело — в простой понятной манере знакомит с языком, кому надо тот заинтересуется, кому не надо — пройдет мимо. Каждому свое.
  • 0
    Автор делает доброе дело, спасибо, с удовольствием изучаю. Возможно вы слушали последний (195) на текущий момент времени UWP (подкаст умпутуна), в котором он расказывал о методах обучения его дочки игре на музыкальном инструменте. Метод донесения инфы автора топика схож с озвученым в подкасте методом (кто не слушал, метод связанный с игрой).
  • +3
    Не хочу лишать людей, знакомящихся с Python, удовольствия самим решать задачки, но все же не могу не продемонстрировать гибкость этого языка.

    Пусть пользователь поместил свою строку в переменную s. Если он вводит только латинские буквы и цифры, то первую задачку можно решить очень просто:

    print s, s, s

    Это строка s сразу в utf-8, latin-1 и cp1251, например. :)

    Python мне нравится и за то, что в ним можно использовать функциональный стиль программирования, что часто сокращает решение до одной строчки и повышает читаемость (ну, это уже когда как):

    for x in map(lambda enc: s.encode(enc), ["cp1251","utf-8", "koi8-r"]):
            print x,

    Тут используется аж два известных функциональных приема — определение безымянной функции (lambda), преобразующей строку s в указанную в параметре кодировку, и её применение (map) к каждому из элементов списка. Таким образом, цикл проходит по списку, состоящему из исходной строки, к которой применилось преобразование в различные кодировки.

    А можно и так:

    print " ".join(map(lambda x: s.encode(x), ["cp1251","utf-8", "koi8-r"]))

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

    Хотя, старый добрый for с перебором кодировок сделает решение более ясным и удобочитаемым (впрочем, это опять же дело вкуса):

    for enc in ["cp1251","utf-8", "koi8-r"]:
            print s.encode(enc)

    Одним словом, программист сам может выбрать стиль, в котором он может писать программы.
    • 0
      почему join - метод строки? по моим представлениям это должен быть метод массива
      всегда было инетересно, почему так
      • 0
        Эти голландцы - такие затейники!..
        • 0
          Сначала тоже показалось странным, но потом привык, и так даже лучше:)
      • 0
        Об этом написано, например, в статье «Бородавки в Python», где пишется про подобные неочевидности.

        Цитата:

        «Гвидо Ван Россум высказался против добавления join() в объекты последовательностей, т.к. это бы означало, что каждая последовательность должна была бы реализовывать этот метод; в Python есть три типа последовательностей (строки, кортежи и списки), а также куча классов, которые ведут себя как последовательности.»


        Я же предпочитаю думать о join просто как о бинарном операторе, у которого слева строка и справа список.
  • –3
    Долой Питон! Да здравствует Пайтон!
  • 0
    Я, наверное, как-то нереально торможу, но так и не въехал в объяснения автора про решётку для третьей задачи...
    • 0
      если в номере телефона есть несколько одинаковых цифр подряд, то каждая вторя заменяется на решетку. чтобы отличить от предыдущей цифры
      • 0
        Дошло. Ничотак.
        http://rafb.net/p/c0F05n12.html - годится? Или можно короче?
        • 0
          неплохо, очень неплохо :) хотя и не слишком читабельно, но демонстрирует много синтаксических плюшек пайтона :)
          особо укорачивать не стоит. тут главное выразительность, а не коротизна...
          • 0
            Вот так лучше, кажется:
            http://rafb.net/p/8Knr8267.html
          • 0
            • 0
              print decode_aon('44##4455')
              ?
              :-)
          • 0
            тоже попробовал :)
            http://rafb.net/p/tLK1ts77.html
            (первый раз на питоне).

            кстати все варианты, кроме http://rafb.net/p/8Knr8267.html , валятся на '##1'
            • 0
              сейчас нет питона под рукой, не на чем проверить. но кажется ваш вариант не будет корректно отрабатывать # в самом начале строки. (могу и ошибиться)
              • 0
                отрабатывает. чтоб не быть голословным, проверил :)
                • 0
                  print decode_aon_numer_short('##44##4455')
                  падает
                  IndexError: string index out of range
                  • 0
                    я про это и писал, что "кстати все варианты, кроме http://rafb.net/p/8Knr8267.html , валятся на '##1'" - все, это и мой в том числе.
                    а на одиночной # не валится :)
          • 0
            Поправил свой вариант http://rafb.net/p/8Knr8267.html
            Стало так:
            http://rafb.net/p/NlDHpu78.html

            Надо ли безошибочно обрабатывать следующие случаи?
            "###4434###552222311333661"
            "5###4434###552222311333661"
          • 0
            мои 5 копеек :)
            http://rafb.net/p/QT4MtA83.html
          • 0
            Вообще не пишу на питоне и не вникал в синтаксис.
            Но вставить свои 5 копеек все же решил :)
            http://rafb.net/p/3O5z2b96.html
            • 0
              неплохо работает и при этом читабелен :)
        • 0
          в трех строчках:
          http://rafb.net/p/SDqC1C58.html
          • 0
            Неправильно работает на:
            "###4434###552222311333661"
            "5###4434###552222311333661"
            • 0
              ну у вас и инпут неправильный ;-)
              можно игнорировать хэши в начале строки: http://rafb.net/p/dGlDyc45.html (там еще интересный вложенный ternary operator)
              • 0
                Гвидо говорит, код читают много больше чем пишут... ;)

                > In [21]: aon_decode("444333444")
                > Out[21]: '34'
        • 0
          теперь осталось найти энтузиаста, который сравнит быстродействие всех этих алгоритмов ;-)
          • +1
            http://rafb.net/p/lUAPb542.html

            Никого не забыл? Ничего не напутал? :)

            Результаты:

            aon_c0F05n12
            failed

            aon_8Knr8267
            f( ##1 ) !=
            failed

            aon_JIJYos17
            failed

            aon_tLK1ts77
            failed

            aon_NlDHpu78
            0.219000101089

            aon_bGjM3C86
            f( ##44##4455 ) != 4445
            failed

            aon_MUDuVv18
            f( ##44##4455 ) != 4445
            failed

            aon_QT4MtA83
            failed

            aon_3O5z2b96
            f( 5###4434###552222311333661 ) != 4452136
            failed

            aon_SDqC1C58
            f( ###4434###552222311333661 ) != 4452136
            failed

            aon_dGlDyc45
            0.296999931335

            aon_f71a95b7a
            0.390000104904
            • 0
              спасибо! вашему решению (NlDHpu78) торжественно присуждаем первое место. приз сегодня скромный - плюсик в карму ;-)
            • 0
              и от меня за титаническую работу по сведению воедино :)
            • 0
              моя исправленная версия работает быстрее всех остальных :)
              http://rafb.net/p/Tm5EBF17.html
            • 0
              провёл маленький тест на ускорение работы скрипта вот сама быстрая версия из всех представленных, хотя не самая красивая.

              далее идет эта версия аналог предыдущей, но покрасивее

              использование операторов is и is not для строк ускоряет процесс, чем использование == и !=
              • 0
                Спасибо, про is и is not не знал. Попробовал — действительно стало заметно быстрее.

                А где можно почитать о таких ускоряющих трюках?
                • 0
                  ну, для начала - почти классическая статья, в основном про работу со строками http://www.python.org/doc/essays/list2st…

                  еще неплохо кое-что описано тут (в основном что иногда полезно "переложить работу на других") http://handyfloss.wordpress.com/2008/02/…

                  кое-что еще тут http://blog.ianbicking.org/book-idea-pyt…

                  на самом деле - в пайтоне полным-полно мест для небольшой оптимизации и советов типа "используйте где только можно кортежи вместо списков", "выносите разрешене методов за пределы циклов" (это вообще на удивление большой прирост иногда дает...

                  и т.п.
                  • 0
                    спасибо за ссылки почитаю
                • 0
                  python.org основной источник, читайте документацию
                  оператор is проверяет идентичность объектов, а == только сравнивает используя метод __eq__ данных объектов.

                  у каждого объекта есть свой идентификатор, вычислить можно так id(obj).

                  например для строк:
                  a = 'test'
                  b = 'test'
                  id(a) == id(b) тоже самое что a is b # true

                  но для строки и юникода результат разный, так как разные объекты:
                  a = 'test'
                  b = u'test'
                  a is b # false
                  хотя a == b # true

                  только не путайте is и == совсем разные операторы.
            • 0
              aon_dGlDyc45 сыпется на aon_decode('22122') == '2', так что чемпиона таки 2.

              Но! Все дружно не учитывают вот такой случай: '33212'. По моей логике должно получиться '32', а не '3', т.к. смотрите, шёл сигнал '33222', и в него затесалась помеха '33212', что скажете?
              • 0
                из условия 33212 - 2 будет считаться помехой т.к. за не следует 1
              • 0
                да. все одиночные символы - помехи.
    • 0
      Кстати, в задачке про АОН если цифра встречается один раз в массиве из повторяющихся цифр, то она разобьет этот массив на группы? То есть, "111111211111" будет равно "1" или "11"? По идее, первый вариант правильный, ведь 2 — это лишь помеха. Но в условии это не было оговорено.

      Попробовал решить задачу без использования циклов, чтобы можно было получить однострочник, и вот, что вышло: http://pastebin.com/f71a95b7a.

      Однострочник для читаемости пришлось развернуть. Кошмарненько, но наверняка можно упростить как-нибудь. :)
      • 0
        не вижу ничего кошмарного :)
        хорошее решение
  • 0
    А ещё можно делать вот так:
    >>> s='123456789'
    >>> s[2:7:2]
    '357'

    То есть кроме начала и коныа ещё и указывать с каким шагом просматривать элементы.
    • 0
      Невнимательно читал. Про это в статье было. (=
      А удалить коммент нельзя?
  • 0
    # все символы с 8 по 14

    >>> str[7:14]

    вот тут мне кажется решение должно быть str[7:13] - ибо 13 это 14-й символ в строке
    • 0
      нет я не прав...хотя это не логично имхо
      надо указать С какого символа брать срез и ДО какого причем его не включать в срез
      • 0
        да, примерно по той же логике работают в С++ алгоритмы (если мне конечно память не изменяет)
        то есть срез [a, b)
        в общем запутывающая логика...
  • +1
    > # каждый второй символ строки.
    > >>> str[::2]
    > 'Hlo re ol!'

    Ещё можно рассказать про то, что step может быть и отрицательным.
    То есть:
    >>> str = "Goodby, cruel world!"
    >>> str[::-1]
    '!dlrow leurc ,ybdooG'
    >>>
    • 0
      ы! вау! спасибо. настолько извращенно я даже не подумал.
      • 0
        Хм, не хочется расстраивать, но в аналоге этого оператора в PHP - функции substr точно также всё работает с отрицательными величинами...
        • 0
          зачем расстраиваться? то что хорошие идеи из Пайтона прживаются в других языках - это же просто замечательно.
          кстати в Пайтоне точно так же идет работа и со списками... так что не тока substr нужен
          • 0
            Всё-таки PHP в основном на веб ориентирован, в отличие от Пайтона.
            Просто не стоит думать, что это такая уникальная фича Пайтона. Хотя фича, бесспорно, крайне рулёзная.
            • 0
              Очень удобно, когда не требуется специальная функция для среза. Подобная штучка, кстати, есть и в Фортране-90 для массивов.
    • 0
      да - иногда такое спрашивают на собеседованиях - как максимально быстро зареверсить строку - питон в этом смысле хорош :))
    • 0
      Охренеть:))
    • 0
      Не могу поставить плюс, поэтому просто спасибо.
  • 0
    Еще один способ склейки строк - написать их подряд.
    >>> "aa" "bb"
    'aabb'
    >>> "aa" \
    ... "bb"
    'aabb'
    >>>

    удобно для красивого оформления многострочных констант в теле функций
    • 0
      да, но работает только со строками. то есть написать типа
      >>> " dsdsd ".strip() "fdfdf"

      увы не получится.
      • 0
        Да. И это правильно - иначе бы порождало жуткую путаницу. Работа со строками стала бы аццким дебугом — пришлось бы постоянно угадывать где он склеит, а где не склеит.
        Я потому и написал, что «удобно для оформления констант», потому что это скорее syntactic sugar — простая удобная форма записи километровой строки, чем запись логики программы.
        • 0
          забыл цитату, типа "синтаксический сахар может зачастую взывать диабет нечитабельности" :) или как-то так... но это пример безопасного сахара
  • 0
    Большое спасибо за гайд! Очень интересно и познаватель - вчера уже скачал интерпритатор, вин32 библиотеки и пару редакторов - сегодня уже пишу анализаторы excel листа на пайтоне, вместо си-шарпа.

    А по по поводу "зачем переписывать книгу" - так доступнее.
    • 0
      а для платформы .NET есть отличая вещь - Boo (http://boo.codehaus.org/) пайтоноподобный язык ориентированный под CLR. отлично интегрируется с шарпом. я даже писал когда-то простую статью как сделать смешанный проект на двух языках :)
      есть кончено и "родной" IronPython - но у него вечный проблемы с динамической памятью
  • +1
    Вы делаете хорошую и правильную работу, создавая этот цикл для начинающих.

    Есть, правда, небольшое замечание - не используйте, пожалуйста, cp1251 и прочие такие, казалось бы, малозначимые штучки, специфические для одной платформы. Здесь много людей, которые используют совсем не платформу от ребят из Редмонда. Да и вообще, cp1251, koi8-r - это же всё уже устарело лет на 15, зачем пользоваться этим, когда есть Unicode ?
    • 0
      но много и тех кто используют :) не будем холиворить...
      хотя я честно написал что Юникод - всегда лучше :))) если доберусь до модуля os - безусловно озвучу версию что *nix вариант представляет куда больше возможностей ;)
  • 0
    Ещё если к строке добавить префикс , то получим так называемые raw строки:

    >>> s = r"Это достаточно длинная строка содержащая\n\
    несколько строк текста."

    >>> print s
    Это достаточно длинная строка содержащая\n\
    несколько строк текста.

    Таким образом обратный слэш и символ перевода строки так же выводятся.
    • 0
      спасибо :)
      я это просто отложил на попозже...
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Предлагаю на суд общества особую, однопроходную реализацию.

    Также отмечу, что для задания кодировки более чем достаточно просто написать # coding: utf8 (или koi8-r, или cp1251, или cp866), не занимаясь лишним украшательством звёздочками и черточками.
  • 0
    У меня вопрос:

    """
    Файл test.txt содержит строку Привет в Win1251
    """
    f = open('test.txt', 'r')
    s = f.readline()
    f.close
    print s.encode('utf-8');

    а получаем ошибку:
    Traceback (most recent call last):
    File " ", line 74, in run_nodebug
    File "E:\Python24\Work\Plurk\test.py", line 7, in
    print unicode(s, 'utf-8');
    UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

    А вообще мне нужно получить строку типа '\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82' для urllib2.
    Как получить такую перекодировку?
    • 0
      .encode() работает только для Unicode строк
      • 0
        точнее даже не так сказать
        http://www.reportlab.com/i18n/python_uni…
        вот тут точнее сформулировано
      • 0
        А после s = f.readline() у меня строка не Unicode уже?
        А если нет, то как её сделать Unicode, что бы потом в UTF-8 перевести?
        • 0
          на самом деле мне нужно получить: "\u041f\u0440\u0438\u0432\u0435\u0442" из строки. Что это вобще за кодировка и как её в Python получить?
  • 0
    s = raw_input()
    dln = s.split()
    dln.sort()
    print dln
    print dln[-1]

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.