2010-10-01 6 views
3

Je ne comprends pas 2.x cela a fonctionné:compresser une chaîne dans python 3?

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

J'ai maintenant:

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

Comment puis-je compresser ma chaîne? Cordialement Bussiere

+1

La compression fonctionne toujours sur des séquences d'octets, mais vous devez d'abord les convertir (c.-à-d., Choisir un codage pour les caractères comme octets). –

+0

duplication possible de [TypeError: 'str' ne supporte pas l'interface tampon] (http://stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface) – Trilarion

Répondre

9

Cela signifie que vous avez réellement un encodage défini.

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' 

La même chaîne pourrait décrire différentes séquences d'octets autrement. Mais c'est en fait une séquence d'octets qui sera encodée par 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" 
+0

Curieux: pourquoi Est-ce que cela fonctionne pour moi (Python 3.0.1, Ubuntu Jaunty) sans appeler 'encoder'? –

+1

Vérifiez les documents de version, cette modification pourrait être appliquée dans une version ultérieure de 3. –

11

Dans les chaînes python 2.x, la chaîne est octets par défaut. En python 3.x ce sont des chaînes Unicode.

La compression nécessite une chaîne d'octets.

+0

Ceci est la vraie réponse. – dotancohen

Questions connexes