сжать строку в python 3?

Я не понимаю, в 2.X это работало:

import zlib
zlib.compress('Hello, world')

теперь у меня есть:

zlib.compress("Hello world!")
TypeError: must be bytes or buffer, not str

Как я могу сжать свою строку? С уважением Бюссьер


person Bussiere    schedule 01.10.2010    source источник
comment
Сжатие всегда работает с последовательностями байтов, но вам нужно сначала преобразовать их в них (т. е. выбрать кодировку для символов в виде байтов).   -  person Donal Fellows    schedule 01.10.2010


Ответы (2)


Это предназначено для обеспечения того, чтобы у вас действительно была определенная кодировка.

zlib.compress("Hello, world".encode("utf-8"))
b'x\x9c\xf3H\xcd\xc9\xc9\xd7Q(\xcf/\xcaI\x01\x00\x1b\xd4\x04i'
zlib.compress("Hello, world".encode("ascii"))
b'x\x9c\xf3H\xcd\xc9\xc9\xd7Q(\xcf/\xcaI\x01\x00\x1b\xd4\x04i'

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

>>> zlib.compress("Hello, wørld".encode("utf-16"))
b'x\x9c\xfb\xff\xcf\x83!\x95!\x07\x08\xf3\x19t\x18\x14\x18\xca\x19~0\x14\x01y)\x0c\x00n\xa6\x06\xef'
>>> zlib.compress("Hello, wørld".encode("utf-8"))
b"x\x9c\xf3H\xcd\xc9\xc9\xd7Q(?\xbc\xa3('\x05\x00#\x7f\x05u"
person relet    schedule 01.10.2010
comment
Любопытно: почему у меня это работает (Python 3.0.1, Ubuntu Jaunty) без вызова encode? - person Manoj Govindan; 01.10.2010
comment
Проверьте документацию по выпуску, это изменение может быть применено в более поздней версии 3. - person Dana the Sane; 01.10.2010
comment
Вау, 2019 год, и этот ответ все еще полезен. Спасибо, что опубликовали все эти годы назад. - person digitalformula; 19.05.2019
comment
Пожалуйста. Разве не здорово, если ваши базовые детали реализации не меняются каждые несколько лет. :D - person relet; 22.05.2019

В python 2.x строки по умолчанию являются строками байтов. В python 3.x это строки unicode.

Для сжатия требуется строка байтов.

person Douglas Leeder    schedule 01.10.2010