Форум сайта python.su
Странная вещь. В коде у меня сравниваются значения юникодовых строк, между которыми приходится вручную вставлять пробел. Выглядит это примерно так:
def popItem(item_name, items_list):
for i, item in enumerate(items_list):
cur_name = str(item[1]) + u"\xa0" + str(item[2])
if item_name == cur_name:
items_list.pop(i)
File “/home/meow-nofer/workspace/pyGrabber/src/test.py”, line 189, in popItemТо есть энкодер почему-то не понимает вставленный мной пробел. Как грамотно исправить положение?
cur_name = str(item) + u“\xa0” + str(item)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 14-16: ordinal not in range(128)
Отредактировано (Окт. 4, 2009 11:39:19)
Офлайн
А какая локаль в шелле, откуда запускаете?
Офлайн
Lolka
LANG=ru_RU.UTF-8
LC_CTYPE=“ru_RU.UTF-8”
LC_NUMERIC=“ru_RU.UTF-8”
LC_TIME=“ru_RU.UTF-8”
LC_COLLATE=“ru_RU.UTF-8”
LC_MONETARY=“ru_RU.UTF-8”
LC_MESSAGES=“ru_RU.UTF-8”
LC_PAPER=“ru_RU.UTF-8”
LC_NAME=“ru_RU.UTF-8”
LC_ADDRESS=“ru_RU.UTF-8”
LC_TELEPHONE=“ru_RU.UTF-8”
LC_MEASUREMENT=“ru_RU.UTF-8”
LC_IDENTIFICATION=“ru_RU.UTF-8”
LC_ALL=
Офлайн
Сравните os.environ и найдите разницу.
Питон в вас, дайте догадаюсь, 2.6.
Зачем вам требуется упорно кастовать item и item к строке, чтобы следующим шагом сделать на конкатенации юникод?
Модификация списка ‘inplace’, которая items_list.pop - очень плохая идея.
Офлайн
Андрей Светлов
Догадались. В os.environ то же самое. В item и item могут быть русские буквы и некоторые сторонние символы (это русский текст, выковыренный парсером из XML-файла, у него кодировка тоже utf-8). Приведение в момент создания списка выдает ошибку юникода, а если не приводить:
cur_name = item + u“\xa0” + itemхотя оба item не пустые. Не понимаю.
TypeError: coercing to Unicode: need string or buffer, NoneType found
Отредактировано (Окт. 4, 2009 13:26:29)
Офлайн
Enchantnerвот эту ошибку выдает и в эклипсе и в терминале? может ошибка где-то раньше закралась?
cur_name = item + u“\xa0” + item
TypeError: coercing to Unicode: need string or buffer, NoneType found
Офлайн
pasaranax
да вроде нет, простая юникодная строка… да, ошибка и там и там
Офлайн
С каких, интересно, пор None стал юникодной строкой?
Да и str, которые вы пытаетесь использовать - тоже не юникод, конечно. Почему бы не заменить на cur_name = unicode(item) + u“\xa0” + unicode(item) ?
Конечно, если вас совсем не беспокоит, что может быть строка u'None\xa0None'.
Общее правило: работайте только с unicode, преобразуйте к строке только перед записью.
Эээх. Годы проходят, а вопросы по использованию non-ascii кодировок не меняются :(
Офлайн
А чем тебя такое решение пугает ?
def popItem(item_name, items_list):
for i, item in enumerate(items_list):
cur_name = str(item[1]) + """ """ + str(item[2])
if item_name == cur_name:
items_list.pop(i)
Офлайн
Люблю immutable типы, по крайней мере для простых значений.
def popItem(item_name, items_tuple):
return tuple(i for i in items_tuple if str(i[1]) + """ """ + str(i[2]) != curr_name)
Отредактировано (Окт. 7, 2009 01:41:56)
Офлайн