Как разбить массив байтов на b '' - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть массивы, подобные следующим:

x = [b'ab ab bc' b'rd rd kh']

По какой-то причине я не знаю, почему между первой байтовой строкой (b'ab ab bc') и второй (b'rd rd kh') нет запятой. Интересно, как я могу разделить их, чтобы получить список вроде:

x = [b'ab ab bc', b'rd rd kh']
# decode
res = [i.decode('utf-8') for i in x]

Я хочу, чтобы результат был как: res = ['ab ab bc', 'rd rd kh']

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Смежные bytes литералы в исходном коде автоматически объединяются :

Несколько смежных строковых или байтовых литералов (разделенных пробелами), возможно, с использованием различных соглашений о кавычках, допускается, и их значение совпадает с их объединением. Таким образом, "hello" 'world' эквивалентно "helloworld".

Таким образом, исходный код вроде:

 x = [b'ab ab bc' b'rd rd kh']

равен точно эквивалентно (компилируется в идентичный байт код):

 x = [b'ab ab bcrd rd kh']

Чтобы разделить их, вам нужно добавить запятую (ы), как вы показали:

 x = [b'ab ab bc', b'rd rd kh']
               # ^ added comma

с decode, сделанным точно так же, как вы показали. Невозможно пропустить запятую, не сделав все это строкой и не написав собственный код синтаксического анализа, что намного более болезненно, чем просто добавление запятой.

0 голосов
/ 21 февраля 2020

Причина, по которой в этом списке нет запятой, заключается в неявном построении строки питонами. На самом деле x - это список с одной байтовой строкой b'ab ab bcrd rd kh'.

Разделение невозможно, как вы видели, вы можете разделить его на bcrd, но я не думаю, что это то, что вы хотите сделать

...