Imprimir la lista de caracteres Unicode sin caracteres de escape

Si tiene una cadena como la que se muestra a continuación, con caracteres Unicode, puede imprimirla y obtener la versión sin escaparse:

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

pero si tenemos una lista que contiene la cadena de arriba e imprímala:

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

Todavía obtienes secuencias de caracteres de escape. ¿Cómo se hace para que el contenido de la lista no se escape, es posible? Me gusta esto:

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

Además, si las cadenas son del tipo unicode , ¿cómo se hace para hacer lo mismo que arriba?

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

Cuando imprime una cadena, obtiene la salida del método __str__ del objeto, en este caso la cadena sin comillas. El método __str__ de una lista es diferente, crea una cadena que contiene la apertura y el cierre [] y la cadena producida por el método __repr__ de cada objeto contenido dentro. Lo que estás viendo es la diferencia entre __str__ y __repr__ .

Puedes construir tu propia cadena en su lugar:

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

Esta versión debería funcionar tanto en Unicode como en cadenas de bytes en Python 2:

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

¿Es esto satisfactorio?

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

En Python 2.x, el valor predeterminado es lo que estás experimentando:

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

En Python 3, sin embargo, se muestra correctamente:

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

Otra solución

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

da [äåö, äå]

Uno puede usar esta clase de envoltura:

 #!/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}