2013-05-28 15 views
5

Se si dispone di una stringa come qui di seguito, con caratteri Unicode, è possibile stamparlo, e ottenere la versione senza caratteri di escape:Stampa lista di caratteri unicode, senza caratteri di escape

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

ma se abbiamo una lista che contiene la stringa sopra e stampatelo:

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

Ancora si ottengono sequenze di caratteri di escape. Come si procede per ottenere il contenuto della lista senza escape, è possibile? Come questo:

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

Inoltre, se le stringhe sono di tipo unicode, come si fa a fare lo stesso come sopra?

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

risposta

8

Quando si stampa una stringa , ottieni l'output del metodo __str__ dell'oggetto - in questo caso la stringa senza virgolette. Il metodo __str__ di un elenco è diverso, crea una stringa contenente l'apertura e la chiusura [] e la stringa prodotta dal metodo __repr__ di ciascun oggetto contenuto all'interno. Quello che stai vedendo è la differenza tra __str__ e __repr__.

È possibile costruire il proprio stringa invece:

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

Questa versione dovrebbe funzionare su entrambi Unicode e stringhe di byte in Python 2:

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

Questo non funziona se l'elenco ha sottoliste. –

+4

@int_ua è possibile eseguire una funzione ricorsiva che la gestisca correttamente. Ma quella non era la domanda. –

6

È soddisfacente?

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


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

C'è una soluzione per 'stringhe unicode'? Ho aggiornato la mia domanda per quel caso di stringhe Unicode. – Parham

3

In Python 2.x di default è quello che stai vivendo:

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

In Python 3, tuttavia, visualizza correttamente:

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

È possibile visualizzarlo correttamente anche in Python 2.7? – Parham

0

Un'altra soluzione

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

dà [äåö, åå]

0

Si può utilizzare questa classe wrapper:

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