我如何gzip压缩Python中的字符串?

Bdf*_*dfy 81 python compression gzip

我如何gzip压缩Python中的字符串?

gzip.GzipFile 存在,但那是文件对象 - 用普通字符串怎么样?

NPE*_*NPE 155

如果要生成完全gzip兼容的二进制字符串,使用标题等,可以gzip.GzipFileStringIO:

import StringIO
import gzip
out = StringIO.StringIO()
with gzip.GzipFile(fileobj=out, mode="w") as f:
  f.write("This is mike number one, isn't this a lot of fun?")
out.getvalue()

# returns '\x1f\x8b\x08\x00\xbd\xbe\xe8N\x02\xff\x0b\xc9\xc8,V\x00\xa2\xdc\xcc\xecT\x85\xbc\xd2\xdc\xa4\xd4"\x85\xfc\xbcT\x1d\xa0X\x9ez\x89B\tH:Q!\'\xbfD!?M!\xad4\xcf\x1e\x00w\xd4\xea\xf41\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)

  • 生命保护程序.真棒.我知道这是旧的,但谢谢! (4认同)
  • @fastmultiplication:或更短:`f = gzip.GzipFile(StringIO.StringIO(text)); result = f.read(); f.close(); 返回结果` (3认同)
  • 与此相反的是:`def gunzip_text(text):infile = StringIO.StringIO()infile.write(text)with gzip.GzipFile(fileobj = infile,mode ="r")as f:f.rewind()f .read()返回out.getvalue() (2认同)
  • 不幸的是,问题一直很接近,所以我无法做出新的答案,但[这里](https://gist.github.com/Garrett-R/dc6f08fc1eab63f94d2cbb89cb61c33d)是如何在Python 3中做到这一点的. (2认同)

Sve*_*ach 59

最简单的方法是zlib 编码:

compressed_value = s.encode("zlib")
Run Code Online (Sandbox Code Playgroud)

然后你用以下方法解压缩它:

plain_string_again = compressed_value.decode("zlib")
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此方法与gzip命令行实用程序不兼容,因为gzip包含标头和校验和,而此机制只是压缩内容. (7认同)
  • @BenjaminToueg:Python 3对Unicode字符串(在Python 3中键入`str`)和字节字符串(类型`bytes`)之间的区别更为严格.`str`对象有一个`encode()`方法返回一个`bytes`对象,`bytes`对象有一个`decode()`方法返回一个`str`.`zlib`编解码器的特殊之处在于它从`bytes`转换为`bytes`,因此它不适合这种结构.您可以使用`codecs.encode(b,"zlib")`和`codecs.decode(b,"slib")`代替`bytes`对象`b`. (5认同)
  • 是字符串? (3认同)
  • 请参阅[标准编码](http://docs.python.org/2/library/codecs.html#standard-encodings)获取的内容(向下滚动到__"编解码器"__).也可用:`s.encode('rot13')`,`s.encode('base64')` (2认同)

Pun*_*rud 12

Sven Marnach 2011年答案的Python3版本:

import gzip
exampleString = 'abcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijmortenpunnerudengelstadrocksklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuvabcdefghijklmnopqrstuv123'
compressed_value = gzip.compress(bytes(exampleString,'utf-8'))
plain_string_again  = gzip.decompress(compressed_value)
Run Code Online (Sandbox Code Playgroud)

  • 在 Python 3 中仍然使用 `zlib`,`gzip` 实际上使用的是 `zlib`,参见:https://docs.python.org/3/library/zlib.html 和 https://docs.python.org/3 /library/gzip.html#module-gzip (3认同)
  • `gzip.decompress` 返回字节,因此调用 `plain_string_again.decode('utf-8')` 来获取 str 对象 (2认同)