为什么在Python 3中会出现以下代码
print(str(b"Hello"))
输出b'Hello'
而不只是Hello
,因为常规文本字符串会发生这种情况?看起来最终是明确的,很容易从最相关的二进制字符串类型创建str
对象是非常反直觉的。
答案 0 :(得分:2)
在Python 3中,bytes.__str__
未定义,因此当您在对象上使用bytes.__repr__
时,会使用str()
。请注意,print()
也在传入的对象上调用str()
,因此此处的调用完全是多余的。
如果您需要文本,请明确解码:
print(b'Hello'.decode('ascii'))
str()
type可以显式处理bytes
个对象,但前提是(再次)提供一个显式编解码器来首先解码字节:
print(str(b'Hello', 'ascii'))
关于此行为的文档非常明确:
如果既没有给出编码也没有错误,
str(object)
会返回object.__str__()
,这是对象的“非正式”或可打印的字符串表示形式。对于字符串对象,这是字符串本身。如果对象没有__str__()
方法,则str()
会回退到repr(object)
。如果至少提供了一个编码或错误, object 应该是字节对象(例如
bytes
或bytearray
)。在这种情况下,如果object是bytes
(或bytearray
)对象,则str(bytes, encoding, errors)
相当于bytes.decode(encoding, errors)
。
和
将
bytes
对象传递给str()
而没有编码或错误参数属于第一种返回非正式字符串表示形式的情况。
强调我的。
答案 1 :(得分:0)
你为什么要这样做"工作"? bytes对象是一个bytes对象,它在Python 3中的字符串表示形式就在那个表单上。您可以将其内容转换为正确的文本字符串(在Python3中 - 在Python2中将是" unicode"对象),您必须解码它到文本。
为此你需要知道编码 -
请尝试以下方法:
print(b"Hello".decode("latin-1"))
注意假设的" latin-1"文本编解码器,它将透明地将不在ASCII范围内的代码(128-256)转换为unicode。它是Windows默认使用的西欧语言编解码器。
" utf-8"编解码器可以表示更大范围的字符,并且是国际文本的首选编码 - 但如果您的字节字符串未正确组成utf-8字符,则您可能在进程上出现UnicodeDecode错误。
请阅读http://www.joelonsoftware.com/articles/Unicode.html以正确查明文字内容。
答案 2 :(得分:0)
事先,抱歉我的英文...
嘿,几周前我遇到了这个问题。它像上面的人一样工作。 如果解码过程的例外无关紧要,这里有一个提示。在这种情况下,您可以使用:bytesText.decode(textEncoding, 'ignore')
例如:
>>> b'text \xab text'.decode('utf-8', 'ignore') # Using UTF-8 is nice as you might know!
'text text' # As you can see, the « (\xab) symbol was
# ignored :D