Python 3.x проводит четкое различие между типами:
str
= '...'
литералы = последовательность символов Unicode (UTF-16 или UTF-32, в зависимости от того, как Python был скомпилирован) bytes
= b'...'
литералы = последовательность октетов (целые числа от 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'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Вы можете кодировать a 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
В версиях Python до 3.0 не было такого различия между текстовыми и двоичными данными.Вместо этого было:
unicode
= u'...'
литералы = последовательность символов Unicode = 3.x str
str
= '...'
литералы = последовательностисмешанных байтов / символов - Обычно текст, закодированный в некоторой неопределенной кодировке.
- Но также используется для представления двоичных данных, таких как
struct.pack
output.
Для облегчения перехода с 2.x на 3.x буквальный синтаксис b'...'
был перенесен в Python 2.6, чтобы можно было различать двоичные строки (которые должны быть bytes
в 3.x) из текстовых строк (которые должны быть str
в 3.x).Префикс b
ничего не делает в 2.x, но говорит скрипту 2to3
не преобразовывать его в строку Unicode в 3.x.
Так что да, литералы b'...'
в Python имеют то же самоецель, которую они делают в PHP.
Кроме того, просто из любопытства, есть ли больше символов, чем b и u, которые делают другие вещи?
* r
префикс создает необработанную строку (например, r'\t'
является обратной косой чертой + t
вместо табуляции), а тройные кавычки '''...'''
или """..."""
допускают многострочные строковые литералы.