使用Python解压缩.Z文件

时间:2015-10-03 10:02:46

标签: python zlib compression

我正在尝试使用Python解压缩* .Z文件。我通过FTP下载它(二进制模式)。该文件使用7zip成功解压缩(文件中的“info”表示它的类型为“Z”)。原始文件可在ftp://cddis.gsfc.nasa.gov/gps/products/1860/igr18600.sp3.Z找到。

我已经阅读了Python中zlib模块的使用,并提供了一些我正在使用的测试代码:

import zlib

comp_data = open('C:\Temp\igr18600.sp3.Z', 'rb').read()

print(comp_data[0:10])

uncomp_data = zlib.decompress(comp_data)
with open('c:\temp\igr18600.sp3', 'wb') as f:
    f.write(uncomp_data)
    f.close()

当我执行此操作时,我得到以下输出:

b'\x1f\x9d\x90#\xc6@\x91\x01#F'
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    uncomp_data = zlib.decompress(comp_data)
zlib.error: Error -3 while decompressing data: incorrect header check

zlib显然不喜欢标题。前几个字节似乎与压缩文件的正确幻数序列0x1F9d匹配(每https://en.wikipedia.org/wiki/List_of_file_signatures)。

在紧要关头,我可以通过直接炮轰7zip来解决这个问题。但我希望找到一个纯Python类型的答案。尽管一天中大部分时间都在谷歌上搜索答案(或者这个错误信息),但我没有太多运气。也许我的搜索技巧是萎缩?

2 个答案:

答案 0 :(得分:4)

Python没有相当于模块中可用的Unix解压缩,这是您解压缩.Z文件所需要的。您可能需要a)shell输出到Unix compress命令,b)shell输出到gzip,c)shell输出到7-zip(gzip和7-zip都能解压缩.Z文件),d)修改C中的原始解压缩代码和Python的链接(代码可在线获取),或e)用本机Python编写自己的LZW解压缩器。

对于d),您可以找到我编写的一些C代码来完成这项工作in this answer on mathematica.stackexchange.com。请参阅unlzw()功能。

答案 1 :(得分:1)

几年过去了,现在有一个python软件包可用于此:unlzw (它实际上基于Mark Adler's answer on mathematica.stackexchange.com

安装

pip install unlzw

用法示例

来自documentation

from unlzw import unlzw

with open('file.Z') as fh:
    compressed_data = fh.read()
    uncompressed_data = unlzw(compressed_data)