Как декодировать самые длинные суббайты в str?

Я рекомендую вам прочитать следующее сообщение: http://codetunnel.io/angularjs-controller-as-or-scope/

он очень хорошо описывает преимущества использования «Controller as» для отображения переменных над «$ scope».

Я знаю, что вы конкретно задавали вопросы о методах, а не переменных, но я думаю, что лучше придерживаться одного метода и быть в соответствии с ним.

Итак, по моему мнению, из-за проблемы с переменными, обсуждаемой в сообщении, лучше просто использовать технику «Контроллер как», а также применить ее к методам.

2
задан Cyker 16 January 2019 в 00:00
поделиться

2 ответа

Как я уже упоминал в комментариях к ответу @ wim, я думаю, что вы можете использовать инкрементальный декодер codecs.iterdecode() для этого. Поскольку это генераторная функция, нет необходимости вручную сохранять и восстанавливать ее состояние между итеративными вызовами.

Вот как это можно использовать для обработки ситуации, подобной той, которую вы описали:

import codecs
from random import randint


def reader(sequence):
    """ Yield random length chunks of sequence until exhausted. """

    plural = lambda word, n, ending='s': (word+ending) if n > 1 else word

    i = 0
    while i < len(sequence):
        size = randint(1, 4)
        chunk = sequence[i: i+size]

        hexrepr = '0x' + ''.join('%02X' % b for b in chunk)
        print('read {} {}: {}'.format(size, plural('byte', len(chunk)), hexrepr))

        yield chunk
        i += size


bytes_obj = b'\xc3\x84\xc3\x96\xc3\x9c\xc3\x84\xc3\x96\xc3\x9c'  # 'ÄÖÜÄÖÜ'

for decoded in codecs.iterdecode(reader(bytes_obj), 'utf-8'):
    print(decoded)

Пример вывода:

read 3 bytes: 0xC384C3
Ä
read 1 byte: 0x96
Ö
read 1 byte: 0xC3
read 3 bytes: 0x9CC384
ÜÄ
read 2 bytes: 0xC396
Ö
read 4 bytes: 0xC39C
Ü
0
ответ дан martineau 16 January 2019 в 00:00
поделиться

Вы описываете основной вариант использования io.TextIOWrapper : буферизованный текстовый поток поверх двоичного потока.

>>> import io 
>>> txt = 'before\N{PILE OF POO}after' 
>>> b = io.BytesIO(txt.encode('utf-8'))
>>> t = io.TextIOWrapper(b) 
>>> t.read(5) 
'befor'
>>> t.read(1) 
'e'
>>> t.read(1)
'                  
0
ответ дан wim 16 January 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: