Comment puis-je gzip compresse une chaîne de caractères en Python?
Comment puis-je gzip compresse une chaîne de caractères en Python?
gzip.GzipFile
existe, mais c'est pour les objets fichier - est-ce que de simples chaînes de caractères?
- que les documents ne mentionne
StringIO
mais n'explique pas vraiment comment le faire. Afin de poser cette question ici est tout à fait valable, à mon humble avis. Certains plus d'essais avant de poser et de nous dire à leur sujet aurait été sympa, mais. - la question a été fermé il y a 4 ans pour la même raison que mon commentaire - l'OP n'a fait aucun effort de recherche en premier.
- Bien sûr, vous avez raison, @KevinDTimm.
- Comment est-ce hors sujet?
- Cette question est le top hit dans google now pour
gzip string in python
et est très raisonnable de l'OMI. Il devrait être ré-ouvert. - Comme ci-dessus, cette question est le premier résultat d'une recherche sur google, et l'une des réponses est correcte, il semble vraiment comme si il ne devrait pas être fermé.
Vous devez vous connecter pour publier un commentaire.
Choisir un module adapté à partir de http://docs.python.org/library/archiving.html -- ou gzip zlib, en fonction de vos besoins exacts.
zlib
etgzip
ne sont pas complètement compatibles; je suppose que l'en-tête est différente. Mais la compression sth avecgzip
et ensuite essayer de le décompresser aveczlib
conduit à une erreur:echo bla | gzip | python -c 'import sys,gzip; sys.stdout.write(gzip.zlib.decompress(sys.stdin.read()))'
→zlib.error: Error -3 while decompressing data: incorrect header check
Si vous voulez produire une complète
gzip
-compatible chaîne binaire, avec l'en-tête, etc, vous pouvez utilisergzip.GzipFile
avecStringIO
:f = gzip.GzipFile(StringIO.StringIO(text)); result = f.read(); f.close(); return result
import zlib; my_string = "hello world"; my_bytes = zlib.compress(my_string.encode('utf-8')); my_hex = my_bytes.hex(); my_bytes2 = bytes.fromhex(my_hex); my_string2 = zlib.decompress(my_bytes); assert my_string == my_string2;
La façon la plus simple est la
zlib
l'encodage:Puis vous le décompresser avec:
s
est un Python 2.x un objet de typestr
.s.encode('rot13')
,s.encode( 'base64' )
plain_string_again = compressed_value.decode("zlib")
str
en Python 3) et les chaînes d'octets (typebytes
).str
objets ont uneencode()
méthode qui retourne unbytes
objet, etbytes
les objets ont unedecode()
méthode qui retourne unstr
. Lezlib
codec est particulier en ce qu'il convertitbytes
àbytes
, de sorte qu'il ne rentre pas dans cette structure. Vous pouvez utilisercodecs.encode(b, "zlib")
etcodecs.decode(b, "slib")
pour unbytes
objetb
à la place.Python3 version de Sven Marnach 2011 de réponse:
zlib
est encore utilisé,gzip
utilisezlib
, voir: docs.python.org/3/library/zlib.html et docs.python.org/3/library/gzip.html#module-gzipPour ceux qui veulent compresser une Pandas dataframe au format JSON:
Testé avec Python 3.6 et les Pandas 0.23