Effectuer des opérations de texte sur des chaînes d’octets en Python

Vous voulez effectuer des opérations de texte courantes (p. ex. stripping, recherche et remplacement) sur les chaînes d’octets.

Les chaînes d’octets supportent déjà la plupart des mêmes opérations intégrées que les chaînes de caractères. Par exemple:

import os.path
def read_into_tampfer(fichier):
   tamp = bytearray(os.path.getsize(fichier))
   with open(fichier, 'rb') as f:
      f.readinto(tamp)
   return tamp

 

De telles opérations fonctionnent également avec des tableaux d’octets. Par exemple:

>>> # Ecrire dans un fichier exemple
>>> with open('exemple.bin', 'wb') as f:
... 	f.write(b'Hello World')
...
>>> tamp = read_into_tampfer('exemple.bin')
>>> tamp
bytearray(b'Hello World')

>>> tamp[0:5] = b'Hallo'
>>> tamp
bytearray(b'Hallo World')

>>> with open('newexemple.bin', 'wb') as f:
... 	f.write(tamp)
...
11
>>>

 

Vous pouvez appliquer l’appariement de motifs d’expressions régulières aux chaînes d’octets, mais les motifs eux-mêmes doivent être spécifiés en octets. Par exemple:

taille_enreg = 32 # Taille de chaque enregistrement (ajuster la valeur)

tamp = bytearray(taille_enreg)

with open('fichier', 'rb') as f:
   while True:
      n = f.readinto(tamp)
      if n < taille_enreg:
         break
      # Utiliser le contenu de tamp
      ...

 

Dans la plupart des cas, presque toutes les opérations disponibles sur les chaînes de texte fonctionnent sur des chaînes d’octets. Cependant, il y a quelques différences notables à prendre en compte.

Premièrement, l’indexation des chaînes d’octets produit des entiers et non des caractères individuels. Par exemple:

>>> tamp
bytearray(b'Hello World')
>>> m1 = memoryview(tamp)
>>> m2 = m1[-5:]
>>> m2
<memory at 0x100681390>
>>> m2[:] = b'WORLD'
>>> tamp
bytearray(b'Hello WORLD')
>>>

 

Cette différence de sémantique peut affecter les programmes qui tentent de traiter les données orientées octets sur la base caractère par caractère.

Deuxièmement, les chaînes d’octets ne fournissent pas une belle représentation des chaînes de caractères et n’impriment pas proprement à moins d’avoir été décodées dans une chaîne de texte. Par exemple:

De même, il n’y a pas d’opérations de formatage de chaînes de caractères disponibles pour les chaînes d’octets.

Si vous voulez faire n’importe quel type de formatage appliqué aux chaînes d’octets, il devrait être fait en utilisant des chaînes de texte et un encodage normales. Par exemple :

Enfin, vous devez être conscient que l’utilisation d’une chaîne d’octets peut changer la sémantique de certaines opérations, en particulier celles liées au système de fichiers.

Par exemple, si vous fournissez un nom de fichier encodé en octets au lieu d’une chaîne de texte, cela désactive généralement l’encodage/décodage du nom de fichier. Par exemple:

Remarquez dans la dernière partie de cet exemple comment le fait de donner une chaîne d’octets comme nom de répertoire a fait que les noms de fichiers résultants ont été retournés sous forme d’octets non décodés.

Le nom de fichier affiché dans la liste du répertoire contient l’encodage UTF-8 brut.

En un dernier commentaire, certains programmeurs pourraient être enclins à utiliser des chaînes d’octets comme alternative aux chaînes de texte en raison d’une amélioration possible des performances.

Bien qu’il soit vrai que manipuler les octets tend à être légèrement plus efficace que le texte (en raison de la surcharge inhérente à l’Unicode), cela conduit généralement à un code très compliqué et non-idiomatique.

Vous constaterez souvent que les chaînes d’octets ne fonctionnent pas bien avec beaucoup d’autres parties de Python, et que vous finirez par devoir effectuer vous-même toutes sortes d’opérations d’encodage/décodage manuel pour faire fonctionner les choses correctement.

Franchement, si vous travaillez avec du texte, utilisez des chaînes de texte normales dans votre programme, pas des chaînes d’octets.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here