【问题标题】:Print LIST of unicode chars without escape characters打印不带转义字符的 unicode 字符列表
【发布时间】:2013-05-23 19:45:44
【问题描述】:

如果您有如下字符串,带有 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']

【问题讨论】:

    标签: python list encoding python-2.7


    【解决方案1】:

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

    【讨论】:

    • @int_ua 您可以创建一个正确处理它的递归函数。但这不是问题所在。
    • 这是迄今为止最好的答案。
    【解决方案2】:

    这样满意吗?

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

    【讨论】:

    • unicode 字符串有这样的解决方法吗?我已经针对 unicode 字符串的情况更新了我的问题。
    【解决方案3】:

    在 Python 2.x 中,默认值是您所遇到的:

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

    但是,在 Python 3 中,它可以正常显示:

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

    【讨论】:

    • 在 Python 2.7 中也能正常显示吗?
    【解决方案4】:

    另一种解决方案

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

    给予 [äåö, äå]

    【讨论】:

      【解决方案5】:

      可以使用这个包装类:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-23
        • 2018-06-22
        • 1970-01-01
        相关资源
        最近更新 更多