2013-05-28 2 views
5

Если у вас есть строка, как показано ниже, с юникод символов, вы можете распечатать его и получить неэкранированный версию:печати СПИСОК юникод символов без экранирующих символов

>>> s = "äåö" 
>>> s 
'\xc3\xa4\xc3\xa5\xc3\xb6' 
>>> print s 
äåö 

, но если у нас есть список, содержащий строку выше и распечатать его:

>>> s = ['äåö'] 
>>> s 
['\xc3\xa4\xc3\xa5\xc3\xb6'] 
>>> print s 
['\xc3\xa4\xc3\xa5\xc3\xb6'] 

Вы по-прежнему получаете экранированные последовательности символов. Как вы собираетесь получить содержимое списка без сохранения, возможно ли это? Как это:

>>> print s 
['äåö'] 

Кроме того, если строки из unicode типа, как вы идете по поводу делать то же самое, что и выше?

>>> s = u'åäö' 
>>> s 
u'\xe5\xe4\xf6' 
>>> print s 
åäö 
>>> s = [u'åäö'] 
>>> s 
[u'\xe5\xe4\xf6'] 
>>> print s 
[u'\xe5\xe4\xf6'] 

ответ

8

При печати строки , вы получаете вывод метода __str__ объекта - в этом случае строка без кавычек. Метод списка __str__ отличается, он создает строку, содержащую открытие и закрытие [], и строку, полученную методом __repr__ каждого объекта, содержащегося внутри. То, что вы видите, - это разница между __str__ и __repr__.

Вы можете создать свою собственную строку вместо:

print '[' + ','.join("'" + str(x) + "'" for x in s) + ']' 

Эта версия должна работать как на Unicode и байтовых строк в Python 2:

print u'[' + u','.join(u"'" + unicode(x) + u"'" for x in s) + u']' 
+0

Это не работает, если список имеет подписи. –

+4

@int_ua вы можете сделать рекурсивную функцию, которая правильно ее обрабатывает. Но это был не вопрос. –

6

Удовлетворительно ли это?

>>> s = ['äåö', 'äå'] 
>>> print "\n".join(s) 
äåö 
äå 
>>> print ", ".join(s) 
äåö, äå 


>>> s = [u'åäö'] 
>>> print ",".join(s) 
åäö 
+0

Есть ли такой обходной путь для 'unicode' строка? Я обновил свой вопрос для этого случая строк в Юникоде. – Parham

3

В Python 2.x по умолчанию является то, что вы испытываете:

>>> s = ['äåö'] 
>>> s 
['\xc3\xa4\xc3\xa5\xc3\xb6'] 

В Python 3, однако он показывает правильно:

>>> s = ['äåö'] 
>>> s 
['äåö'] 
+0

Возможно ли это правильно отобразить в Python 2.7? – Parham

0

Другое решение

s = ['äåö', 'äå'] 
encodedlist=', '.join(map(unicode, s)) 
print(u'[{}]'.format(encodedlist).encode('UTF-8')) 

дает [ååö, äå]

0

Можно использовать этот класс обертки:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

class ReprToStrString(str): 
    def __repr__(self): 
     return "'" + self.__str__() + "'" 


class ReprToStr(object): 
    def __init__(self, printable): 
     if isinstance(printable, str): 
      self._printable = ReprToStrString(printable) 
     elif isinstance(printable, list): 
      self._printable = list([ReprToStr(item) for item in printable]) 
     elif isinstance(printable, dict): 
      self._printable = dict(
       [(ReprToStr(key), ReprToStr(value)) for (key, value) in printable.items()]) 
     else: 
      self._printable = printable 

    def __repr__(self): 
     return self._printable.__repr__() 


russian1 = ['Валенки', 'Матрёшка'] 
print russian1 
# Output: 
# ['\xd0\x92\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xba\xd0\xb8', '\xd0\x9c\xd0\xb0\xd1\x82\xd1\x80\xd1\x91\xd1\x88\xd0\xba\xd0\xb0'] 
print ReprToStr(russian1) 
# Output: 
# ['Валенки', 'Матрёшка'] 


russian2 = {'Валенки': 145, 'Матрёшка': 100500} 
print russian2 
# Output: 
# {'\xd0\x92\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xba\xd0\xb8': 145, '\xd0\x9c\xd0\xb0\xd1\x82\xd1\x80\xd1\x91\xd1\x88\xd0\xba\xd0\xb0': 100500} 
print ReprToStr(russian2) 
# Output: 
# {'Матрёшка': 100500, 'Валенки': 145} 
Смежные вопросы