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

b'The string'

我想知道:

字符串前面的b是什么意思? 使用它的效果是什么? 在什么情况下使用它比较合适?

我在SO上找到了一个相关的问题,但这个问题是关于PHP的,它指出b是用来表示字符串是二进制的,而不是Unicode,这是需要代码从PHP < 6版本兼容,当迁移到PHP 6时。我不认为这适用于Python。

我确实在Python网站上找到了这个文档,是关于使用u字符以相同的语法指定字符串作为Unicode的。不幸的是,该文档中没有任何地方提到b字符。

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


引用Python 2。x文档:

前缀'b'或'b'会被忽略 Python 2;它表明 字面量应该变成字节字面量 在Python 3中(例如,当代码是 自动转换为2to3)。一个 'u'或'b'前缀后面可以跟着 一个'r'前缀。

Python 3文档声明:

字节字面值总是以'b'或'b'作为前缀;它们生成bytes类型的实例,而不是STR类型的实例。它们可能只包含ASCII字符;数值为128或更大的字节必须用转义来表示。


它将其转换为bytes字面值(或2.x中的str),并且对2.6+有效。

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


b表示字节字符串。

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

如果你有一个多字符的字符串对象,你取一个字符,它将是一个字符串,它的大小可能超过1字节,这取决于编码。

如果使用字节字符串的1个字节,您将得到一个从0-255的8位值,如果这些字符由于编码是> 1字节,那么它可能不代表一个完整的字符。

TBH我会使用字符串,除非我有一些特定的低级别的理由使用字节。


Python 3。X明确区分了这两种类型:

STR = '…' literals = Unicode字符序列(Latin-1, UCS-2或UCS-4,取决于字符串中最宽的字符) Bytes = b'…' literals =一个字节序列(0到255之间的整数)

如果你熟悉:

Java或c#,将str视为String,将bytes视为byte[]; SQL,把str看成NVARCHAR,字节看成BINARY或BLOB; Windows注册表,将str视为REG_SZ, bytes视为REG_BINARY。

如果您熟悉C(++),那么请忘记您所学的关于char和字符串的所有内容,因为字符不是字节。这种想法早就过时了。

当你想要表示文本时,可以使用str。

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

当您希望表示低级二进制数据(如结构体)时,可以使用字节。

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')
'€'

但这两种类型不能随意混合。

>>> 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”……'符号有点令人困惑,因为它允许字节0x01-0x7F用ASCII字符而不是十六进制数字指定。

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

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

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

Python 2.x

3.0之前版本的Python缺乏这种文本和二进制数据之间的区别。取而代之的是:

Unicode = u'…' literals = Unicode字符序列= 3。x str STR = '…' literals =混乱的字节/字符序列 通常是文本,用某种未指定的编码方式编码。 但也用于表示二进制数据,如struct。包输出。

为了简化2.x到3。X跃迁,b'…的文字语法被回移植到Python 2.6,以便允许区分二进制字符串(在3.x中应该是字节)和文本字符串(在3.x中应该是str)。前缀b在2中没有任何作用。但是告诉2to3脚本不要将它转换为3.x中的Unicode字符串。

所以是的,b'…'字面值在Python中与在PHP中具有相同的目的。

另外,出于好奇,它们都在那里 比b和u更多的符号 其他事情吗?

前缀r创建一个原始字符串(例如,r'\t'是一个反斜杠+ t而不是制表符),以及三引号" '…" '或"""…"""允许多行字符串字面量。


下面是一个例子,在Python 3.x中,缺少b将抛出TypeError异常

>>> 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前缀就能解决这个问题。


除了其他人所说的,请注意unicode中的单个字符可以包含多个字节。

unicode的工作方式是,它采用了旧的ASCII格式(7位代码,看起来像0xxx xxxx),并添加了多字节序列,其中所有字节都以1 (1xxx xxxx)开头,以表示ASCII以外的字符,以便unicode与ASCII向后兼容。

>>> len('Öl')  # German word for 'oil' with 2 characters
2
>>> 'Öl'.encode('UTF-8')  # convert str to bytes 
b'\xc3\x96l'
>>> len('Öl'.encode('UTF-8'))  # 3 bytes encode 2 characters !
3

从服务器端,如果我们发送任何响应,它将以字节类型的形式发送,因此它将在客户端显示为b' response From server'

为了消去b'....'只需使用下面的代码:

服务器文件:

stri="Response from server"    
c.send(stri.encode())

客户端文件:

print(s.recv(1024).decode())

然后打印Response from server


您可以使用JSON将其转换为字典

import json
data = b'{"key":"value"}'
print(json.loads(data))

{“关键”:“价值”}


瓶:

这是一个flask的例子。在终端行上运行:

import requests
requests.post(url='http://localhost(example)/',json={'key':'value'})

瓶/ routes.py

@app.route('/', methods=['POST'])
def api_script_add():
    print(request.data) # --> b'{"hi":"Hello"}'
    print(json.loads(request.data))
return json.loads(request.data)

{“关键”:“价值”}


问题的答案是:

data.encode()

为了解码它(去掉b,因为有时候你不需要它)

use:

data.decode()

b"hello" is not a string (even though it looks like one), but a byte sequence. It is a sequence of 5 numbers, which, if you mapped them to a character table, would look like h e l l o. However the value itself is not a string, Python just has a convenient syntax for defining byte sequences using text characters rather than the numbers itself. This saves you some typing, and also often byte sequences are meant to be interpreted as characters. However, this is not always the case - for example, reading a JPG file will produce a sequence of nonsense letters inside b"..." because JPGs have a non-text structure.

.encode()和.decode()在字符串和字节之间转换。


Bytes (somestring.encode())是在python 3中为我工作的解决方案。

def compare_types():
    output = b'sometext'
    print(output)
    print(type(output))


    somestring = 'sometext'
    encoded_string = somestring.encode()
    output = bytes(encoded_string)
    print(output)
    print(type(output))


compare_types()