2014-11-07 2 views
0

Я довольно новичок в Python. Сегодня я пришел теперь о модуле ZLIB и запустите следующую код-Что возвращает zlib.compress (string) в Python 2.7.8

import zlib 
s = 'hello world!hello world!hello world!hello world!' 
t = zlib.compress(s) 
print t 
print zlib.decompress(t) 

и возвращает следующую вещь:

xœËHÍÉÉW(Ï/ÊIQÌ ‚ 
hello world!hello world!hello world!hello world! 

очевидно, zlib.compress() также возвращает некоторые странные нотации другие чем те, которые я не могу скопировать в мой вопрос.

Мой вопрос

IS-

1) Что сжимающей строка на самом деле означает?

2) Существуют ли какие-либо значения (или любые условные обозначения) этих странных обозначений?

3) Каковы реальные приложения функции compress()?

N.B.- Я не знаю других языков программирования. Поэтому у меня очень мало опыта программирования.

+0

Сжатие = занимать меньше места. –

+0

Насколько мне известно, zlib использует кодировку Хаффмана (http://en.wikipedia.org/wiki/Huffman_coding) для сжатия данных, поэтому то, что вы видите, это всего лишь двоичные данные, которые интерпретатор пытается форматировать как текст – Moritz

+0

Спасибо, Мориц. Я понимаю. – ni8mr

ответ

4

Вы печатаете сжатые данные. Сжатые данные - это не текст, а просто двоичные данные, которые представляют одну и ту же информацию в меньшем пространстве.

Записывая эти сжатые данные на ваш терминал, он может попробовать и интерпретировать данные как текст по-прежнему; если он ожидает, что текст с кодировкой Latin-1 или UTF-8 будет обработан, тогда он попытается декодировать эти данные и отобразить текст, который ему удалось декодировать. Таким образом, вы получаете тарабарщину, потому что данные на самом деле не являются текстом.

Мой Mac терминал установлен в UTF-8, и я получаю что-то отличное от того, что вы видите:

>>> import zlib 
>>> s = 'hello world!hello world!hello world!hello world!' 
>>> t = zlib.compress(s) 
>>> print t 
?[?H???W(?/?IQ? ? 

The ? вопросительные знаки указывают, что терминал не был даже способен декодировать все как UTF- 8; вполне ожидаемый, поскольку данные недействительны UTF-8.

Различные кодировки приведут к разным выходам; опять же, потому что данные на самом деле не представляя текст в любом текстовом кодеке:

>>> print t.decode('cp850').encode('utf8') 
¢[§H═╔╔W(¤/╩IQ╠ é 
>>> print t.decode('cp1251').encode('utf8') 
Ѕ[хHНЙЙW(П/КIQМ ‚ 
>>> print t.decode('mac-roman').encode('utf8') 
Ω[ıHÕ……W(œ/ IQÃ Ç 

В .encode('utf8') звонках действительно лишние; Python обнаружил, что я использую терминал UTF-8 и автоматически кодирую строки Unicode для меня.

Python также может предоставить вам различные представления одних и тех же данных; вторя строку в интерпретатора Python (вместо использования print), или печать вывод repr() дает вам выход отформатирован в виде строки Python буквального, что будет воссоздать такое же значение:

>>> t 
'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaIQ\xcc \x82\r\x00\xbd[\x11\xf5' 
>>> print repr(t) 
'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaIQ\xcc \x82\r\x00\xbd[\x11\xf5' 

Любой байт, который может быть интерпретируемый как печатный символ ASCII, показан как таковой, все остальное отображается как \xhh шестнадцатеричные экраны (с символами новой строки, возвратом каретки и вкладками с использованием \n, \r и \t соответственно).

Вы также могли бы кодировать все значения байтов в шестнадцатеричном:

>>> print t.encode('hex') 
789ccb48cdc9c95728cf2fca4951cc20820d00bd5b11f5 

Имея данные занимают меньше места в очень полезно. Отправка данных по сети займет меньше времени (меньше данных для отправки), или вы можете сохранить на диске. При сжатии изображений вы можете даже отказаться от некоторой информации при сжатии; Например, изображения JPEG используют такую ​​схему сжатия с потерями. В зависимости от уровня качества, который вы установили, вы потеряете более или менее оригинальную информацию, но вы можете вкраплять много информации об изображении в файл таким образом.

+0

Спасибо, это объясняет многое. Как новичок, декодирование двоичного вывода в utf-8 (в моем случае) не приходило мне в голову, также я не знал, что возвращаемые данные будут в двоичном формате. – ni8mr

Смежные вопросы