Как вы сжимаете и шифруете поток текста в Python - PullRequest
0 голосов
/ 25 апреля 2018

Допустим, у меня есть поток (генератор), который производит текст. Обычно это строки JSON, но это может быть любая строка. И я не могу создать экземпляр этого списка. Слишком большой.

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

Шифрование не так сложно, но для сжатия обычно требуется пакет данных. Есть ли чистый способ потоковой передачи? Если нет, то что является достаточно хорошей альтернативой?

Я также не хочу создавать файлы.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Можете ли вы сгруппировать данные с помощью группировщика из рецепта itertools ?

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

chunksize = 10
iterable = range(100)
for chunk in grouper(iterable, chunksize, fillvalue=''):
    print(chunk)

return:

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
(20, 21, 22, 23, 24, 25, 26, 27, 28, 29)
...

Обратите внимание, что он никогда не создает список свсе данные!

0 голосов
/ 25 апреля 2018

stdlib zlib поддерживает сжатие потока данных путем одновременной подачи кусков.См. compressobj и тип Compress.

Обратите внимание, что вы можете загружать столько байтов, сколько хотите;объект компрессора выполняет свою собственную буферизацию, чтобы zlib был доволен.

Многие другие библиотеки сжатия созданы для имитации интерфейса zlib до некоторой степени.

И, как вы уже знаете, шифрованиеобычно это не проблема.

Поскольку вы начинаете с текста, а не с байтов, у вашей проблемы есть и ноль: кодирование текста.Вы можете использовать модуль codecs для потокового кодировщика, но, поскольку он звучит так, как будто у вас уже есть генератор по одной строке за раз, (line.encode('utf-8') for line in lines) должно быть просто отлично.(Вы, вероятно, уже знали эту часть, поэтому не спрашивали, но будущий искатель с такой же проблемой может и не знать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...