b字符在string前做了什么?
显然,以下是有效的语法…
my_string = b'The string'
我想知道…
- string的前面是什么意思?
- 使用它的效果是什么?
- 什么是适当的情况下使用它。
我在这里find了一个相关的问题 ,但是这个问题是关于PHP的,虽然它说明b
是用来表示string是二进制的,而不是unicode,这是需要代码从PHP版本<6兼容时迁移到PHP 6.我不认为这适用于Python。
我没有在python网站上find关于在同一语法中使用u
字符来指定一个string为unicode的文档 。 不幸的是,它没有提到该文件中任何地方的b字符。
另外,出于好奇,除了b
和u
之外,还有其他的符号吗?
引用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
视为BINARY
或BLOB
。 如果您熟悉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.xstr
-
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”前缀可以解决问题。