Python 3.x fait une distinction claire entre les types :
Si vous êtes familier avec :
- Java ou C#, pensez à
str
como String
y bytes
como byte[]
;
- SQL, pensez à
str
como NVARCHAR
y bytes
como BINARY
o BLOB
;
- Le registre de Windows, pensez à
str
como REG_SZ
y bytes
como REG_BINARY
.
Si vous êtes familier avec le C(++), alors oubliez tout ce que vous avez appris sur le char
et des chaînes de caractères, car un caractère n'est pas un octet . Cette idée est depuis longtemps obsolète.
Vous utilisez str
lorsque vous voulez représenter du texte.
print('שלום עולם')
Vous utilisez bytes
lorsque vous voulez représenter des données binaires de bas niveau comme les structs.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Vous pouvez encoder a str
à 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
En b'...'
est quelque peu déroutante dans la mesure où elle permet de spécifier les octets 0x01-0x7F avec des caractères ASCII au lieu de chiffres hexadécimaux.
>>> b'A' == b'\x41'
True
Mais je dois insister, un caractère n'est pas un octet .
>>> 'A' == b'A'
False
En Python 2.x
Les versions antérieures à la version 3.0 de Python ne faisaient pas ce genre de distinction entre les données textuelles et binaires. À la place, il y avait :
-
unicode
= u'...'
littéraux = séquence de caractères Unicode = 3.x str
-
str
= '...'
littéraux = séquences d'octets/caractères confondus
- Généralement du texte, codé dans un codage non spécifié.
- Mais aussi utilisé pour représenter des données binaires comme
struct.pack
sortie.
Afin de faciliter la transition de 2.x à 3.x, l'initiative b'...'
a été rétroportée dans Python 2.6, afin de permettre la distinction entre les chaînes binaires (qui doivent être bytes
en 3.x) à partir de chaînes de texte (qui devraient être str
en 3.x). Le site b
ne fait rien dans la version 2.x, mais indique à la fonction 2to3
script pour ne pas le convertir en chaîne Unicode dans 3.x.
Alors oui, b'...'
Les littéraux en Python ont le même but qu'en PHP.
Aussi, juste par curiosité, y a-t-il d'autres symboles que le b et le u qui font d'autres choses ?
En r
Le préfixe crée une chaîne brute (par exemple, r'\t'
est un backslash + t
au lieu d'une tabulation), et des guillemets triples '''...'''
o """..."""
autoriser les chaînes littérales multi-lignes.
1 votes
Pour la partie curiosité, depuis python 3.6 il y a les f-strings qui sont vraiment utiles. Vous pouvez faire : v = "world" print(f "Hello {v}") obtenir "Hello world". Un autre exemple est f"{2 * 5}" qui vous donne "10". C'est la voie à suivre pour travailler avec des chaînes de caractères.