2016-12-29 2 views
0

В моем скрипте я получаю сообщение об ошибке из БД и хочу показать его на веб-странице. Он работает идеально, пока я не получаю локальные письма в сообщении об ошибке. Сообщение является кортежем.Ошибка кодирования str() для списка или кортежа в python2

>>> # coding: utf-8 
... 

# string with u 
>>> data1 = (1, u'Это мой текст') 
>>> print data1[1] 
Это мой текст 
>>> print str(data1) 
(1, u'\u042d\u0442\u043e \u043c\u043e\u0439 \u0442\u0435\u043a\u0441\u0442') 

# string without u 
>>> data2 = (1, 'Это мой текст') 
>>> print data2[1] 
Это мой текст 
>>> print str(data2) 
(1, '\xd0\xad\xd1\x82\xd0\xbe \xd0\xbc\xd0\xbe\xd0\xb9 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82') 

# I want like this 
>>> str(data2).??? # WHAT I HAVE TO DO??? 
(1, 'Это мой текст') 

# Current solution for me, but I want to know about better and more beautiful solution 
>>> print ', '.join(map(lambda x: x.decode('utf-8') if isinstance(x, str) else str(x), data2)) 
1, Это мой текст 

Можете ли вы помочь мне найти (???) метод и объяснить, почему это происходит. Спасибо !!!

+0

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

+0

Я не получаю ошибку, но выводю на веб-странице следующим образом: "(1, '\ xd0 \ xad \ xd1 \ x82 \ xd0 \ xbe \ xd0 \ xbc \ xd0 \ xbe \ xd0 \ xb9 \ xd1 \ x82 \ xd0 \ xb5 \ xd0 \ xba \ xd1 \ x81 \ xd1 \ x82 ') " –

+0

так что не так с вашим решением? – MooingRawr

ответ

0

Когда вы печатаете объект (turple в вашем случае), вы получаете вывод метода __str__ объекта. __str__ методы разных объектов различны: для строки это строка без кавычек, для turple она создает строку, содержащую открытие и закрытие (), и строку, созданную методом __repr__ каждого объекта, содержащегося внутри. Для того, чтобы получить результат, который вы хотите, вы должны сочетать методы (путем проверки типа объектов), например:

print ", ".join(map(lambda x: not isinstance(x, basestring) and str(x) or x, [1, "абв"])) 
print ", ".join(map(lambda x: not isinstance(x, basestring) and str(x) or x, [1, u"абв"])) 

Кроме того, конечно, есть Lagre количество трюков. Например, вы можете использовать демпинг метод из json библиотеки:

import json 
print(json.dumps(("message", "уеуке"), ensure_ascii=False)) 
# ["message", "уеуке"] 
print(json.dumps(("message", u"уеуке"), ensure_ascii=False)) 
# ["message", "уеуке"]