【问题标题】:How to convert *any* Python object into a string?如何将 *any* Python 对象转换为字符串?
【发布时间】:2015-12-17 16:52:40
【问题描述】:

我想将各种 Python 对象的列表连接成一个字符串。对象实际上可以是任何东西。我想我可以使用以下代码简单地做到这一点:

' '.join([str(x) for x in the_list])

但不幸的是,有时这会给我一个 UnicodeEncodeError:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 80: ordinal not in range(128)

this SO answer我发现有人说我需要使用.encode('utf-8'),所以我把我的代码改成这样:

' '.join([x.encode('utf-8') for x in the_list])

但如果对象不是字符串或 unicode,而是例如ints,我会得到一个AttributeError: 'int' object has no attribute 'encode'。所以这意味着我需要使用某种 if 语句来检查它是什么类型以及如何转换它。但是什么时候应该使用.encode('utf-8'),什么时候应该使用str()

如果我也可以为此做某种单线器会更好,但我不知道怎么做?还有人知道吗?欢迎所有提示!

【问题讨论】:

  • 除了“产生一个字符串”之外,你希望这个转换做什么?据推测,结果应该以某种方式代表原始对象,但究竟生成什么字符串有多大关系?
  • @user2357112 - 因为它主要用于记录目的,所以它有多接近并不重要。
  • 那为什么不把你的清单打印出来呢?

标签: python utf-8


【解决方案1】:

Python 2.x 使用repr()。如果您不介意结果中的非 ASCII Unicode,Python 3.x 使用 repr(),如果您介意,则使用 ascii()

>>> a=1             # integer
>>> class X: pass
...
>>> x=X()           # class
>>> y='\u5000'      # Unicode string
>>> z=b'\xa0'       # non-ASCII byte string
>>> ' '.join(ascii(i) for i in (a,x,y,z))
"1 <__main__.X object at 0x0000000002974B38> '\\u5000' b'\\xa0'"

2.X 和 3.X repr() 和 3.X ascii() 之间的差异示例:

>>> # Python 3
>>> s = 'pingüino' # Unicode string
>>> s
'pingüino'
>>> repr(s)
"'pingüino'"
>>> print(repr(s))
'pingüino'
>>> ascii(s)
"'ping\\xfcino'"
>>> print(ascii(s))
'ping\xfcino'    

>>> # Python 2
>>> s = u'pingüino'
>>> s
u'ping\xfcino'
>>> repr(s)
"u'ping\\xfcino'"
>>> print(repr(s))
u'ping\xfcino'

【讨论】:

  • 为了澄清,从repr() 的文档字符串中,它返回对象的规范字符串表示。因此,想象一下您打印到控制台的任何内容,例如一个类引用、列表或其他任何东西,它都会变成一个字符串。
  • 你从哪里得到这个ascii()函数?如果我尝试ascii('something'),我会得到NameError: name 'ascii' is not defined。我尝试导入它并四处寻找它,但我找不到任何提到这样的功能。还有更多提示吗?
  • @kramer65, ascii() 仅适用于 Python 3.x。它的工作方式类似于 Python 2.x 上的 repr()。当输出编码支持时,Python 3.x 上的repr() 将显示可打印的非 ASCII,使英语以外的语言更容易读取输出。
  • 感谢您的解释。我非常喜欢 Python 2.7,以至于我什至没有想到 Python 3 的可能性。感谢您指出这一点。由于现在大多数库都已移植,因此我可能会考虑从 Python 3 开始,以及即将推出的项目。
【解决方案2】:

您可以尝试使用 unicode 对象 joining..

u' '.join(unicode(x) for x in thelist)

或者你以前的东西在 python3 中可以正常工作。请务必:

  1. 尽早解码
  2. unicode 无处不在
  3. 编码延迟

更多详情见this talk

【讨论】:

  • 这并不总是有效,例如unicode('ü') 导致UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)。还有其他想法吗?
  • 我尝试运行一个包含两行的文件:# -*- coding: utf-8 -*-print unicode('ü'),但我仍然得到UnicodeDecodeError
  • 对不起。您需要使用 unicode 对象。要么做print u'ü',要么如果你必须使用一个字符串,你必须用print 'ü'.decode('utf8')解码它
【解决方案3】:

您可以尝试将三元运算符与当前的单行符结合起来。 join 也适用于生成器,所以我认为您不需要创建列表。像

' '.join(x.encode('utf-8') if isinstance(x, basestring) else str(x)
         for x in the_list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2021-08-03
    • 2021-12-07
    • 2021-02-03
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多