2013-05-28 43 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}