2013-05-28 41 views
5

如果你有一個字符串,如下面,使用Unicode字符,你可以打印出來,並得到轉義版本:打印列表不轉義字符

>>> 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) + ']' 

這個版本應該在Python 2 Unicode和字節串的工作:

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'串這樣的解決方法嗎?我更新了這個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}