显然,下面是有效的语法...

my_string = b'The string'

我很想知道...

  1. 此字符串的 infront 的b字符是什么意思?
  2. 使用它的效果是什么?
  3. 什么是适当的情况下使用它。

我在等找到相关的问题就在这里,但是问题不过是关于 PHP,同时说明b用于指示字符串是二进制而不是 unicode,它能够兼容版本的 PHP 代码中,需要在升级到 PHP 6 的 < 6。我并不认为这适用于 Python。

未找到有关使用u字符相同的语法中,指定为 unicode 字符串的 python 站点上的此文档遗憾的是,它没有提到该文档中的任意位置的b字符。

此外,只是出于好奇心,还有做其他事情比bu更多的符号吗?

2011-06-07 18:14:52
问题评论:

回答:

以报价的 Python 2.x 文档:

前缀为 'b' 或 'B' 忽略在 Python 2;它指示该文本应成为义在 Python (例如当代码自动转换与 2to3) 的 3 个字节。'U' 或 'b' 前缀后面可能跟着一个 r 前缀。

Python 3.3 文档所述︰

始终为字节文本前缀与 'b' 或 'B';它们产生而不是字符串类型的字节类型的实例。他们可能只包含 ASCII 字符。必须使用转义符表示数字值为大于或等于 128 字节。

因此,这听起来像 Python < v3 将忽略此额外的字符。什么是 v3 中的某个用例需要使用 b 字符串而不是仅仅是一个正则字符串?

@Gweebz-如果您实际键入出特定编码而不是使用 unicode 转义的字符串 (如。 而不是 'u32e1' b 'xffxfexe12')。

有道理。我会将标记为已接受的答案这一但也有其他很好的答案 !

实际上,如果您已经从__future__导入unicode_literals ,这将"反向"此特定字符串的行为 (在 Python 中 2.x)

Python 3.x使类型之间的明显区别︰

  • str = '...'原义字符序列的 Unicode 字符 (utf-16 或 utf-32,具体取决于如何编译 Python) =
  • bytes= b'...'文字 = 序列的八位字节 (介于 0 和 255 之间的整数)

如果您熟悉 Java 或 C#,认为str作为Stringbytesbyte[]如果您熟悉 SQL,考虑作为NVARCHAR str和作为BINARYBLOBbytes如果您熟悉 Windows 注册表,考虑为REG_SZ str和为REG_BINARYbytes如果您熟悉 C(++),然后忘记一切您已经学习了如何char和字符串,因为字符不是字节这个想法是多长时间已过时。

当您想要表示的文本时,您可以使用str

print('שלום עולם')

要用于表示结构类似的低级二进制数据时,您可以使用bytes

NaN = struct.unpack('>d', b'xffxf8x00x00x00x00x00x00')[0]

您可以对进行编码bytes对象str

>>> 'uFEFF'.encode('UTF-8')
b'xefxbbxbf'

并可以对bytes进行解码为str.

>>> b'xE2x82xAC'.decode('UTF-8')
'€'

但是,不能自由地混合使用这两种类型。

>>> b'xEFxBBxBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

b'...'表示法的有些令人费解,在于它允许 0x01-0x7F 而不是十六进制数字的 ASCII 字符对指定的字节数。

>>> b'A' == b'x41'
True

但我必须强调,一个字符不是字节.

>>> 'A' == b'A'
False

在 Python 中 2.x

Pre-3.0 版本的 Python 缺乏这种类型的文本和二进制数据之间的区别。相反,有了︰

  • unicode = u'...'文字 = Unicode 字符序列 = 3.x str
  • str = '...'文字 = 感到相当困惑的字节字符序列
    • 通常,文本中一些未指定编码的编码。
    • 但还用于表示二进制数据,例如struct.pack输出。

为了减轻 2.x 到 3.x 过渡, b'...'文本语法以便区分二进制字符串 (这应该是在 3.x 中的bytes),从文本字符串 (这应该是 3.x str ) 是 Python 2.6 到 backported。b前缀不执行任何操作在 2.x,但告诉2to3脚本,无法将其转换为 Unicode 字符串在 3.x 中。

没错, b'...'在 Python 中的文本具有相同的目的,在 PHP。

此外,只是出于好奇心,还有做其他事情比 b,并且更多的符号吗?

r前缀创建原始字符串 (如r' '为反斜杠 + t而不是一个选项卡),三引号和'''...'''"""..."""允许多行字符串文本。

+ 1 感谢您您全面的答案 !我会标记为正确此一昨天之前 aix 提供足够的信息,我认为他作为第一个正确的答案。

谢谢 !我之后读这些句子理解:"为了简化 2.x 到 3.x 转换,b...文本语法是 backported 到 Python 2.6,以便从文本字符串 (这应该是 str 3.x) 区分二进制字符串 (这应该是在 3.x 中的字节数)。B 前缀不起作用在 2.x,但是告诉 2to3 脚本,无法将其转换为 Unicode 字符串在 3.x。"

python 版本信息解释时非常有用。谢谢。

非常全面的不幸的是它不能解释如何从一个 bytes() 对象获取有意义的 Py3 str()

@erikb85︰ 添加。

B 表示一个字节的字符串。

字节是实际数据。字符串是一种抽象。

如果过多字符的字符串对象和所用的单个字符,它是一个字符串,并且可能会超过 1 个字节的大小取决于编码。

如果花费 1 个字节的字节字符串会单个 8 位值从 0-255 之间,它不可能表示一个完整的字符,如果由于编码这些字符 > 1 个字节。

我将使用字符串,除非有一些特殊低级别的原因要使用字节 TBH。

关闭到义bytes(或str在 2.x),并对 2.6 + 有效。

r前缀会导致反斜杠进行"解释"(不会忽略,和差异does事务)。

这听起来错误根据文档引用的 aix 的回答;在 Python 版本不是 3,b 将被忽略。

它将是str在 2.x 无论哪种情况,因此可以说,它将被忽略。当从__future__模块中导入unicode_literals的重要区别。

对不起,我误解与原始语句。您的答案是准确在说什么。

下面是一个示例,其中没有 'b' 会引发 TypeError 异常,在 Python 中 3.x

>>> f=open("new", "wb")
>>> f.write("Hello Python!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

添加一个 b 前缀可以解决该问题。

有用的注释 fella,从未来的谢谢

请输入您的翻译

What does the 'b' character do in front of a string literal?

确认取消