我正在尝试使用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类型的答案。尽管一天中大部分时间都在谷歌上搜索答案(或者这个错误信息),但我没有太多运气。也许我的搜索技巧是萎缩?
答案 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
from unlzw import unlzw
with open('file.Z') as fh:
compressed_data = fh.read()
uncompressed_data = unlzw(compressed_data)