zlib不以标准zip格式压缩

时间:2012-09-11 19:55:22

标签: python compression zlib

我正在使用python zlib,我正在执行以下操作:

  1. 压缩内存中的大字符串(zlib.compress
  2. 上传到S3
  3. 从S3(zlib.decompress
  4. 下载并读取和解压缩数据

    一切正常,但是当我直接从S3下载文件并尝试使用标准zip程序打开它时,我收到错误。我注意到,而不是PK,文件的开头是:

    xµ}ko$7’םחע¯¸?ְ)$“שo³¶w¯1k{`
    

    我很灵活,不介意从zlib切换到另一个包,但它必须是pythonic(Heroku兼容)

    谢谢!

3 个答案:

答案 0 :(得分:7)

zlib压缩文件;它不会创建ZIP存档。为此,请参阅zipfile

答案 1 :(得分:0)

如果这只是压缩字符串,那么zlib就是要走的路。 zip文件用于存储文件甚至整个目录树和文件。它保存文件元数据。它可以(某种方式)用于,但不适合存储字符串。

如果您的应用程序只是存储和检索压缩字符串,那么“直接从S3下载文件并尝试使用标准zip程序打开它们”毫无意义。你为什么要这样做?

编辑:

S3通常用于存储文件,而不是字符串。你说你想存储字符串。您确定S3是适合您的服务吗?你看过SimpleDB了吗?

考虑您想要坚持使用S3并希望上传压缩字符串。您的S3客户端库很可能希望接收类似文件的对象以进行读取。要有效地解决这个问题,请将压缩后的字符串存储在Python StringIO对象中(在内存文件中),并将此内存中文件提供给S3客户端库,以便将其上载到S3。

下载也一样。使用Python。也用于调试目的。尝试将字符串强制转换为zipfile是没有意义的。与使用普通的zlibbed字符串相比,会有更多的开销(由于文件元数据)。

答案 2 :(得分:0)

为了调试目的而编写zip文件的替代方法(完全是错误的应用程序格式)是使用可以解压缩zlib流的实用程序,这对于您的应用程序来说是完全正确的格式。该实用程序为pigz-z选项。