用Python解压.Z文件

用Python解压.Z文件,python,zlib,compression,Python,Zlib,Compression,我正在尝试使用Python解压一个*.Z文件。我通过FTP(二进制模式)下载了它。该文件使用7zip成功解压(文件上的“信息”显示其类型为“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_da

我正在尝试使用Python解压一个*.Z文件。我通过FTP(二进制模式)下载了它。该文件使用7zip成功解压(文件上的“信息”显示其类型为“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
b'\x1f\x9d\x90#\xc6@\x91\x01#F'
回溯(最近一次呼叫最后一次):
文件“test.py”,第7行,在
解压数据=zlib.解压(压缩数据)
zlib.error:解压缩数据时出错-3:标头检查不正确
zlib显然不喜欢标题。前两个字节似乎与压缩文件(per)的正确幻数序列0x1F9d相匹配


在紧要关头,我可以通过直接打到7zip来解决这个问题。但我希望找到一个纯Python类型的答案。尽管我花了一天的大部分时间在谷歌上搜索答案(或者这个错误消息),但我运气不太好。也许我的搜索技能正在衰退

Python没有模块中可用的Unix解压缩功能,这是解压缩.Z文件所需的功能。您可能需要a)使用Unix compress命令,b)使用gzip命令,c)使用7-zip命令(gzip和7-zip都可以解压.Z文件),d)使用c修改原始解压代码并将其链接到Python(代码在线提供),或者e)使用本机Python编写自己的LZW解压程序


对于d),您可以找到一些我为完成这项工作而编写的C代码。查看
unlzw()
函数。

几年过去了,现在有了用于此的python包:
unlzw
unlzw3
[1]

1) unlzw
  • GitHub:(最后一次提交2017-10)
  • PyPI:
  • 文件:
  • 优点/缺点:该软件包提供了一个(.so或.pyd),这使其速度更快。缺点是它只构建了高达CPython 3.6的版本(实际上是?),如果您在Windows上安装它,pip将下载
    .tar.gz
    ,您必须安装C编译器才能使安装正常工作。我试过了,因为我安装了一个C编译器,所以它可以与CPython 3.8.6一起工作
1.1)安装* *请参见上面关于赞成/反对意见的注释

1.2)示例用法
从unlzw导入unlzw
打开('file.Z','rb')作为fh:
压缩数据=fh.read()
未压缩的_数据=unlzw(压缩的_数据)
2) unlzw3
  • GitHub:(最后提交2020-07年)。基于
  • PyPI:
  • 优点/缺点:纯python实现,这意味着它将使用python在“任何”平台上安装和运行,包括不使用C编译器的Windows。它也比C语言实现慢(参见下面的基准测试)
2.1)安装 2.2)示例用法 从:

附录:基准 使用从下载的文件
igsg1450.20i.Z

基准测试显示,对于1000个类似的.Z文件,使用unlzw只需等待3.5秒,而使用unlzw3只需等待2.8分钟。对于一次性转换,差异可能并不重要



[1] 所有这些实际上都是基于mathematica.stackexchange.com上的

链接还提到了
7-Zip文件格式
as
377abc AF 271c
。谢谢标记。感谢您在zlib上的辛勤工作。很高兴听到我没有遗漏什么明显的东西。现在我将介绍7-zip,并开始研究d和e,以供我自己借鉴,感谢您处理纯python实现。我也会尝试一下你的申请。
pip install unlzw
pip install unlzw3
import unlzw3
from pathlib import Path

uncompressed_data = unlzw3.unlzw(Path('file.Z'))
unlzw
3.5 ms ± 93 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

unlzw3
166 ms ± 2.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)