Python >> Tutoriel Python >  >> Python

Comment diviser une chaîne d'octets en lignes ?

Formulation du problème :Étant donné une chaîne d'octets contenant des caractères de nouvelle ligne '\n' . Comment diviser la chaîne d'octets en une liste de lignes ?

Exemple :Vous souhaitez transformer la chaîne d'octets b'your\nbyte\nstring' dans la liste des chaînes d'octets [b'your', b'byte', b'string'] en utilisant b'\n' comme séparateur de nouvelle ligne.

Given:    b'your\nbyte\nstring'
Goal:     [b'your', b'byte', b'string']

Solution  :Pour diviser une chaîne d'octets en une liste de lignes - chaque ligne étant elle-même une chaîne d'octets - utilisez le Bytes.split(delimiter) méthode et utilisez le caractère de saut de ligne Bytes b'\n' comme délimiteur.

>>> s = b'your\nbyte\nstring'
>>> s.split(b'\n')
[b'your', b'byte', b'string']

Les objets Bytes ressemblent à des chaînes mais sont préfixés par le b symbole pour indiquer qu'ils sont différents des chaînes. Comme les chaînes, ce sont des séquences immuables de caractères uniques. Cependant, contrairement aux chaînes, les caractères se composent uniquement d'un seul octet plutôt que de plusieurs octets. Ainsi, ils sont basés sur l'encodage ASCII plutôt que sur l'encodage Unicode plus moderne.

Convertir la chaîne d'octets en chaîne et diviser la chaîne

Une alternative consiste à convertir d'abord la chaîne d'octets en une chaîne normale, puis à utiliser le string.split() méthode sur la structure de données convertie. Dans de nombreux cas, c'est la méthode recommandée car elle garantit que vous utilisez un encodage moderne.

>>> s = b'your\nbyte\nstring'
>>> s = s.decode()
>>> s.split('\n')
['your', 'byte', 'string']

Dépannage

Notez que vous devez utiliser une chaîne d'octets comme délimiteur ou Python lancera un TypeError: a bytes-like object is required, not 'str'

>>> s = b'your\nbyte\nstring'
>>> s.split('\n')
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    s.split('\n')
TypeError: a bytes-like object is required, not 'str'

Le correctif consiste à utiliser le délimiteur d'octets b'\n' comme indiqué précédemment :

>>> s.split(b'\n')
[b'your', b'byte', b'string']