сжать строку в Python 3? - PullRequest
       305

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

4 голосов
/ 01 октября 2010

я не понимаю в 2.X все заработало:

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 01 октября 2010

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

Сжатие требует строки байтов.

13 голосов
/ 01 октября 2010

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

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"
...