打印Unicode字符列表而不使用转义字符

9
如果您有一个包含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']
5个回答

9
当你打印一个字符串时,你会得到该对象的__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']'

4
@int_ua您可以编写一个递归函数来正确处理它。但这不是问题所在。 - Mark Ransom
到目前为止,这是最好的答案。 - sb32134

8
这个可以吗?
>>> s = ['äåö', 'äå']
>>> print "\n".join(s)
äåö
äå
>>> print ", ".join(s)
äåö, äå


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

有没有针对“unicode”字符串的解决方法?我已经针对那种情况更新了我的问题。 - Parham

3
在Python 2.x中,默认情况下您正在经历的是这样的:
>>> s = ['äåö']
>>> s
['\xc3\xa4\xc3\xa5\xc3\xb6']

在Python 3中,它会正确地显示:
>>> s = ['äåö']
>>> s
['äåö']

1
它是否可以在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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接