字符串文字前面的“b”字符起什么作用?

2024-11-21 08:33:00
admin
原创
5
摘要:问题描述:显然,以下是有效的语法:b'The string' 我想知道:b字符串前面的这个字符代表什么意思?使用起来有什么效果呢?什么情况下适合使用它?我在 SO 上找到了一个相关问题,但是这个问题是关于 PHP 的,它指出b用于指示字符串是二进制的,而不是 Unicode,这是在迁移到 PHP 6 时代码与...

问题描述:

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

b'The string'

我想知道:

  1. b字符串前面的这个字符代表什么意思?

  2. 使用起来有什么效果呢?

  3. 什么情况下适合使用它?

我在 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视为NVARCHARbytes视为BINARYBLOB

  • 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)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用