字符串文字前面的“b”字符起什么作用?
- 2024-11-21 08:33:00
- admin 原创
- 5
问题描述:
显然,以下是有效的语法:
b'The string'
我想知道:
b
字符串前面的这个字符代表什么意思?使用起来有什么效果呢?
什么情况下适合使用它?
我在 SO 上找到了一个相关问题,但是这个问题是关于 PHP 的,它指出b
用于指示字符串是二进制的,而不是 Unicode,这是在迁移到 PHP 6 时代码与 PHP <6 版本兼容所必需的。我不认为这适用于 Python。
我确实在 Python 网站上找到了有关使用相同语法中的字符将字符串指定为 Unicode 的文档u
。不幸的是,该文档中没有任何地方提到b字符。
此外,只是出于好奇,除了和之外,还有什么符号b
可以u
做其他事情吗?
解决方案 1:
Python 3.x对类型进行了明确的区分:
str
=文字 =字符'...'
序列。“字符”是文本的基本单位:字母、数字、标点符号、符号、空格或“控制字符”(如制表符或退格键)。Unicode标准将每个字符分配给 0 到 0x10FFFF 之间的整数代码点。(嗯,或多或少。Unicode 包括连字符和组合字符,因此字符串可能不具有与用户感知字符相同的代码点数量。)在内部,使用灵活的字符串表示形式,每个代码点可以使用 1、2 或 4 个字节。str
bytes
=文字 =字节b'...'
序列。“字节”是计算机上可寻址的最小整数类型,几乎普遍为八位字节或 8 位单位,因此允许 0 到 255 之间的数字。
如果您熟悉:
Java 或 C#,将其
str
视为String
和;bytes
`byte[]`SQL,将
str
视为NVARCHAR
和bytes
视为BINARY
或BLOB
;Windows 注册表,将
str
视为REG_SZ
和。bytes
`REG_BINARY`
如果你熟悉 C(++),那么就忘掉你所学过的所有关于char
和 字符串的知识吧,因为字符 不是 字节。这种想法早已过时了。
str
当您想要表示文本时使用它。
print('שלום עולם')
bytes
当您想要表示结构体等低级二进制数据时使用它。
NaN = struct.unpack('>d', b'xffxf8x00x00x00x00x00x00')[0]
您可以将 编码为str
一个bytes
对象。
>>> '/uFEFF'.encode('UTF-8')
b'xefxbbxbf'
您可以将 a 解码bytes
为 a 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'...'
表示法有点令人困惑,因为它允许用 ASCII 字符而不是十六进制数来指定字节 0x01-0x7F。
>>> b'A' == b'x41'
True
但我必须强调,字符不是一个字节。
>>> 'A' == b'A'
False
在 Python 2.x 中
Python 3.0 之前的版本缺乏这种对文本和二进制数据的区别。相反,有:
unicode
=u'...'
文字 = Unicode 字符序列 = 3.xstr
str
='...'
文字 = 混乱的字节/字符序列通常是文本,以某些未指定的编码进行编码。
但也用于表示像
struct.pack
输出这样的二进制数据。
为了简化 2.x 到 3.x 的转换,b'...'
文字语法被反向移植到 Python 2.6,以便区分二进制字符串(应该bytes
在 3.x 中)和文本字符串(应该str
在 3.x 中)。b
前缀在 2.x 中不执行任何操作,但会告诉2to3
脚本不要在 3.x 中将其转换为 Unicode 字符串。
因此,是的,b'...'
Python 中的文字与 PHP 中的文字具有相同的用途。
另外,只是出于好奇,除了 b 和 u 之外,还有更多符号可以做其他事情吗?
前缀r
创建一个原始字符串(例如,r' '
反斜杠 +t
而不是制表符),以及三重引号'''...'''
或"""..."""
允许多行字符串文字。
前缀f
(在 Python 3.6 中引入)创建一个可以引用 Python 变量的“格式化字符串文字”。例如,f'My name is {name}.'
是 的简写'My name is {0}.'.format(name)
。
解决方案 2:
引用Python 2.x 文档:
在 Python 2 中,前缀“b”或“B”会被忽略;它表示在 Python 3 中,该字面量应变为字节字面量(例如,当使用 2to3 自动转换代码时)。前缀“u”或“b”后面可以跟一个前缀“r”。
Python 3 文档指出:
字节字面量始终以“b”或“B”为前缀;它们会生成字节类型而非 str 类型的实例。它们只能包含 ASCII 字符;数值为 128 或更大的字节必须用转义符表示。
解决方案 3:
b 表示字节字符串。
字节是实际的数据。字符串是一种抽象。
如果您有多字符的字符串对象并且采用单个字符,那么它将是一个字符串,并且根据编码,其大小可能超过 1 个字节。
如果使用 1 个字节作为字节字符串,您将获得一个介于 0-255 之间的 8 位值,并且如果由于编码而导致这些字符大于 1 个字节,它可能无法表示完整的字符。
老实说,我会使用字符串,除非我有一些特定的低级原因需要使用字节。
解决方案 4:
从服务器端,如果我们发送任何响应,它将以字节类型的形式发送,因此它将在客户端显示为b'Response from server'
为了摆脱b'....'
只需使用下面的代码:
服务器文件:
stri="Response from server"
c.send(stri.encode())
客户端文件:
print(s.recv(1024).decode())
然后它将打印Response from server
解决方案 5:
这个问题的答案是:
data.encode()
并对其进行解码(删除b
,因为有时您不需要它)
使用:
data.decode()
解决方案 6:
下面是一个例子,其中缺少将在 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
前缀可以解决问题。
解决方案 7:
它将其转换为bytes
文字(或str
在 2.x 中),并且对 2.6+ 有效。
前缀r
导致反斜杠“未被解释”(未被忽略,并且差异确实很重要)。
解决方案 8:
除了其他人所说的之外,请注意 unicode 中的单个字符可以由多个字节组成。
unicode 的工作方式是采用旧的 ASCII 格式(类似于 0xxx xxxx 的 7 位代码),并添加所有字节都以 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'xc3x96l'
>>> len('Öl'.encode('UTF-8')) # 3 bytes encode 2 characters !
3
解决方案 9:
b"hello"
不是一个字符串(尽管它看起来像一个字符串),而是一个字节序列。它是一个由 5 个数字组成的序列,如果将它们映射到字符表,则看起来像h e l l o
。但是,值本身不是字符串,Python 只是有一个方便的语法,可以使用文本字符而不是数字本身来定义字节序列。这可以为您节省一些输入,而且字节序列通常被解释为字符。但是,情况并非总是如此 - 例如,读取 JPG 文件会产生一系列无意义的字母,b"..."
因为 JPG 具有非文本结构。
.encode()
并.decode()
在字符串和字节之间进行转换。
解决方案 10:
您可以使用 JSON 将其转换为字典
import json
data = b'{"key":"value"}'
print(json.loads(data))
{"键":"值"}
烧瓶:
这是来自 flask 的一个例子。在终端行上运行它:
import requests
requests.post(url='http://localhost(example)/',json={'key':'value'})
在 flask/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)
{'键':'值'}
解决方案 11:
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()
解决方案 12:
回答问题 1 和 2:b 表示你想将普通的 String 类型改变/利用为 Byte 类型。例如:
>>> type(b'')
<class 'bytes'>
>>> type('')
<class 'str'>
回答问题 3:当我们想要检查某个文件/对象的字节流(字节序列)时,可以使用它。例如,我们想要检查某个文件的 SHA1 消息摘要:
import hashlib
def hash_file(filename):
""""This function returns the SHA-1 hash of the file passed into it"""
# make a hash object
h = hashlib.sha1()
# open file for reading in binary mode
with open(filename,'rb') as file:
# loop till the end of the file
chunk = 0
while chunk != b'':
# read only 1024 bytes at a time
chunk = file.read(1024)
h.update(chunk)
# return the hex representation of digest
return h.hexdigest()
message = hash_file("somefile.pdf")
print(message)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件