Python 3.x fait une distinction claire entre les types:
str
= '...'
littéraux = une séquence de caractères Unicode (UTF-16 ou UTF-32, selon la façon dont Python a été compilé)
bytes
= b'...'
littéraux = une séquence d'octets (entiers compris entre 0 et 255)
Si vous êtes familier avec Java ou C #, pensez au str
fur String
et à bytes
mesure byte[]
. Si vous connaissez SQL, pensez à str
as NVARCHAR
et bytes
as BINARY
ou BLOB
. Si vous êtes familier avec le registre Windows, pensez au str
fur REG_SZ
et à bytes
mesure REG_BINARY
. Si vous êtes familier avec C (++), oubliez tout ce que vous avez appris char
et les chaînes, car UN PERSONNAGE N'EST PAS UN OCTET . Cette idée est depuis longtemps obsolète.
Vous utilisez str
lorsque vous souhaitez représenter du texte.
print('שלום עולם')
Vous utilisez bytes
lorsque vous souhaitez représenter des données binaires de bas niveau comme des structures.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Vous pouvez encoder un str
en un bytes
objet.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Et vous pouvez décoder un bytes
en un str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Mais vous ne pouvez pas mélanger librement les deux 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
La b'...'
notation est quelque peu déroutante en ce qu'elle permet de spécifier les octets 0x01-0x7F avec des caractères ASCII au lieu de nombres hexadécimaux.
>>> b'A' == b'\x41'
True
Mais je dois souligner qu'un caractère n'est pas un octet .
>>> 'A' == b'A'
False
En Python 2.x
Les versions pré-3.0 de Python n'avaient pas ce genre de distinction entre le texte et les données binaires. Au lieu de cela, il y avait:
unicode
= u'...'
littéraux = séquence de caractères Unicode = 3.xstr
str
= '...'
littéraux = séquences d'octets / caractères confondus
- Généralement du texte, codé dans un codage non spécifié.
- Mais également utilisé pour représenter des données binaires comme la
struct.pack
sortie.
Afin de faciliter la transition de 2.x vers 3.x, la b'...'
syntaxe littérale a été rétroportée vers Python 2.6, afin de permettre de distinguer les chaînes binaires (qui devraient être bytes
en 3.x) des chaînes de texte (qui devraient être str
en 3 .X). Le b
préfixe ne fait rien dans 2.x, mais indique au 2to3
script de ne pas le convertir en chaîne Unicode dans 3.x.
Alors oui, les b'...'
littéraux en Python ont le même objectif qu'en PHP.
Aussi, juste par curiosité, y a-t-il plus de symboles que le b et le u qui font autre chose?
Le r
préfixe crée une chaîne brute (par exemple, r'\t'
est une barre oblique inversée + t
au lieu d'un onglet), et des guillemets triples '''...'''
ou """..."""
autorisent des littéraux de chaîne multi-lignes.