b字符在string前做了什么?

显然,以下是有效的语法…

my_string = b'The string' 

我想知道…

  1. string的前面是什么意思?
  2. 使用它的效果是什么?
  3. 什么是适当的情况下使用它。

我在这里find了一个相关的问题 ,但是这个问题是关于PHP的,虽然它说明b是用来表示string是二进制的,而不是unicode,这是需要代码从PHP版本<6兼容时迁移到PHP 6.我不认为这适用于Python。

我没有在python网站上find关于在同一语法中使用u字符来指定一个string为unicode的文档 。 不幸的是,它没有提到该文件中任何地方的b字符。

另外,出于好奇,除了bu之外,还有其他的符号吗?

引用Python 2.x文档 :

Python 2中忽略了“b”或“B”的前缀; 它表明文字应该成为Python 3中的字节文字(例如,当代码自动转换为2to3时)。 前缀“u”或“b”后面可以加“r”前缀。

Python 3.3文档指出:

字节文字总是以“b”或“B”作为前缀。 他们产生一个字节types的实例,而不是strtypes。 它们只能包含ASCII字符; 数值为128或更大的字节必须用转义符表示。

Python 3.x在types之间做了明确的区分:

  • str = '...' literals =一系列Unicode字符(UTF-16或UTF-32,取决于Python的编译方式)
  • bytes = b'...'文字=一串八位字节(0到255之间的整数)

如果您熟悉Java或C#,请将str视为String ,将bytes视为byte[] 。 如果您熟悉SQL,请将str视为NVARCHAR ,将bytes视为BINARYBLOB 。 如果您熟悉Windowsregistry,请将str视为REG_SZ ,将bytes视为REG_BINARY 。 如果您熟悉C(++),那么忘记所有关于char和string的知识,因为字符不是字节 。 那个想法已经过时了。

当你想要代表文本时使用str

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

当你想表示像结构体这样的低级二进制数据时,你使用bytes

 NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0] 

您可以将str 编码为一个bytes对象。

 >>> '\uFEFF'.encode('UTF-8') b'\xef\xbb\xbf' 

你可以将一个bytes解码为一个str

 >>> b'\xE2\x82\xAC'.decode('UTF-8') '€' 

但是你不能自由地混合这两种types。

 >>> b'\xEF\xBB\xBF' + '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'...'符号有些令人困惑,它允许用ASCII字符而不是hex数字来指定字节0x01-0x7F。

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

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

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

在Python 2.x中

Python的3.0之前的版本缺乏这种文本和二进制数据之间的区别。 相反,有:

  • unicode = u'...' literals = Unicode字符序列= 3.x str
  • str = '...'文字=混杂字节/字符的序列
    • 通常文本,编码在一些未指定的编码。
    • 但也用来表示像struct.pack输出的二进制数据。

为了缓解2.x到3.x的转换, b'...'文字语法被反向移植到Python 2.6中,以便允许从文本区分二进制string(应该是3.x中的bytes )string(在3.x中应该是str )。 b前缀在2.x中不做任何事情,但是告诉2to3脚本不要在3.x中将其转换为Unicodestring。

所以是的, b'...'在Python中的文字具有相同的目的,他们在PHP中。

另外,出于好奇,除了b和u之外,还有其他的符号吗?

r前缀创build一个原始string(例如, r'\t'是一个反斜杠+ t而不是一个制表符),三重引号'''...'''"""..."""允许多string文字。

b表示一个字节串。

字节是实际的数据。 string是一个抽象。

如果你有多字符的string对象,并且只有一个字符,那么它将是一个string,根据编码的不同,它可能会超过1个字节。

如果用一个字节string占用1个字节,则会从0-255中得到一个8位值,如果由于编码造成的这些字符大于1个字节,则可能不会表示完整的字符。

TBH我会使用string,除非我有一些特定的低级别的原因使用字节。

它把它变成一个bytes文字(或2.x中的str ),并且对于2.6+是有效的。

r前缀会导致反斜杠“未解释”(不会被忽略,差异也很重要)。

下面是一个例子,其中缺less'b'会在Python 3.x中抛出一个TypeErrorexception

 >>> 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”前缀可以解决问题。