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

b'The string'

我想知道:

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

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

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

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


当前回答

除了其他人所说的,请注意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

其他回答

除了其他人所说的,请注意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

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而不是制表符),以及三引号" '…" '或"""…"""允许多行字符串字面量。

b表示字节字符串。

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

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

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

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

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

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

您可以使用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)

{“关键”:“价值”}