Python字符串前面的b前缀是什么意思?

144

我在一个Python源代码中看到了一个字符串前有一个小的b,例如:

b"abcdef"

我知道在Python中使用u前缀表示Unicode字符串,使用r前缀表示原始字符串字面值。

b是什么意思?它在哪些源代码中有用?因为它看起来与没有任何前缀的普通字符串完全相同。


10
如果你点击提供的链接,你会发现在2.6版本中字符串前缀不允许使用b前缀(似乎是参考资料中的小错误)。关于这种事情进行谷歌搜索并不容易。我尝试了像“b python string prefix”这样的关键词,但基本上没有什么收获。 - kriss
S.Lott使用的链接缺少版本说明符;这是关于Python 3的:https://docs.python.org/3/reference/lexical_analysis.html#string-literals。现在还支持前缀[Python 2.6及以上版本](https://docs.python.org/2/whatsnew/2.6.html#pep-3112-byte-literals),以便促进跨版本Python代码的编写。 - Martijn Pieters
1
这个问题既不是“完全重复”,也不是对“我能在我的打印语句中去掉这个'b'字符吗?”问题的回答。http://stackoverflow.com/questions/42599851/can-i-get-rid-of-this-b-character-in-my-print-statement/42599902#42599902 你介意取消标记吗,Marijin?提问者和实际尝试回答的人可能会感激能够得到对实际问题的回答。 - me_
2个回答

139

b前缀表示bytes字符串字面量

如果你在Python 3源代码中看到它被使用,该表达式会创建一个bytes对象,而不是普通的Unicode str对象。如果你在Python shell中看到它被回显或作为列表、字典或其他容器内容的一部分出现,那么你看到的是用这种符号表示的bytes对象。

bytes对象基本上包含0-255范围内的整数序列,但在表示时,Python将这些字节显示为ASCII码点以便更容易读取其内容。任何超出可打印的ASCII字符范围的字节都会显示为转义序列(例如\n\x82等)。反过来,您可以使用ASCII字符和转义序列来定义字节值;对于ASCII值,它们的数字值被使用(例如b'A' == b'\x41'

因为bytes对象由整数序列组成,所以您可以使用任何其他0-255范围内的整数序列(例如列表)构造一个bytes对象:

bytes([72, 101, 108, 108, 111])

索引操作返回整数值(但切片操作会产生一个新的bytes值;对于上述示例,value[0]返回72,但value[:1]b'H',因为72是大写字母H的ASCII码点)。

bytes模块用于表示二进制数据,包括编码文本。如果你的bytes值包含文本,则需要使用正确的编解码器进行解码。例如,如果数据以UTF-8编码,则可以使用以下代码获取Unicode str值:

strvalue = bytesvalue.decode('utf-8')

相反地,如果要从str对象中的文本转换为bytes,则需要进行编码。您需要决定要使用的编码方式;默认情况下使用UTF-8,但实际上取决于您的用例:
bytesvalue = strvalue.encode('utf-8')

你也可以使用构造函数bytes(strvalue, encoding)来完成同样的操作。
解码和编码方法都需要一个额外的参数来指定如何处理错误
Python 2版本2.6和2.7还支持使用b'..'字符串字面语法创建字符串字面值,以简化在Python 2和3上都可用的代码。 bytes对象是不可变的,就像str字符串一样。如果需要具有可变字节值,则使用bytearray()对象

73

这是Python3的bytesliteral。在Python 2.5及更早版本中,此前缀不存在(它相当于2.x中的普通字符串,而3.x中的普通字符串相当于带有u前缀的文字)。在Python 2.6+中,它相当于普通字符串,为了与3.x兼容


@WRAR:我在Python 2.6的代码中看到了这个,似乎是在Python 2.6中引入的。 - kriss
在发布之前,我特意在2.6参考文档中进行了检查:http://docs.python.org/reference/lexical_analysis.html#literals - wRAR
1
好的,“为了未来的兼容性,Python 2.6将bytes作为str类型的同义词,并支持b''表示法。”,来自“What's new”。 - wRAR
由于上面的链接现在指向2.7参考和添加了b前缀,这里提供一个旧的虚假参考链接http://docs.python.org/release/2.6.8/reference/lexical_analysis.html#literals。 - kriss

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