Для того, чтобы уменьшить объем длинной текстовой строки, например для снижения трафика при передаче текстовых данных через Интернет, ее можно сжать перед отправкой и разархивировать после получения. При этом объем передаваемых данных значительно снижается, по сравнению с передачей текстовых строк в их исходном виде.
Чтобы заархивировать текстовую строку в памяти, воспользуемся модулем zlib.
Для сжатия строки мы будем использовать функцию compress. Эта функция принимает во входном параметре строку байт и возвращает эту строку в сжатом виде.
1 2 3 4 5 6 7 8 9 10 11 12 |
import zlib long_text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' print('long_text', len(long_text)) long_text_compressed = zlib.compress(long_text.encode('utf-8')) print('long_text_compressed', len(long_text_compressed)) # long_text 445 # long_text_compressed 270 |
Как видно на простейшем примере, объем строки сократился более чем в полтора раза.
Так как zlib.compress во входном аргументе принимает строку байт, мы предварительно закодировали исходный текст в набор байт UTF-8 с помощью функции encode.
В результате компрессии мы так же получили строку байт. Если протокол передачи данных требует передавать именно текстовую строку, мы можем получить ее закодировав результат в base64.
1 2 3 4 5 6 7 |
import base64 long_text_compressed_b64 = base64.b64encode(long_text_compressed) print('long_text_compressed_b64', len(long_text_compressed_b64)) # long_text_compressed_b64 360 |
Как мы видим, размер строки увеличился, но все равно остается меньше, чем размер исходной строки текста. При увеличении размера исходного текста, разница между сжатым и не сжатым текстами будет увеличиваться.
Чтобы из сжатого текста получить исходный, нужно его декодировать и разархивировать. Для этого проведем обратные преобразования:
1 2 3 4 5 6 |
decoded_b64_text = base64.b64decode(long_text_compressed_b64) undompressed_text = zlib.decompress(decoded_b64_text).decode('utf-8') print(undompressed_text) # Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. |