使用 Python 解压缩 .Z 文件

Tom*_*son 5 python compression zlib

我正在尝试使用 Python 解压缩 *.Z 文件。我是通过 FTP(二进制模式)下载的。该文件使用 7zip 成功解压缩(文件上的“信息”表示它的类型为“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()
Run Code Online (Sandbox Code Playgroud)

当我执行这个时,我得到以下输出:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ler 6

Python 没有模块中可用的 Unix uncompress 等效项,这是解压缩 .Z 文件所需的。您可能需要 a) 转为 Unix 压缩命令,b) 转为 gzip,c) 转为 7-zip(gzip 和 7-zip 都可以解压缩 .Z 文件),d) 修改使用 C 语言解压原始代码并将其链接到 Python(该代码可在线获取),或者 e) 使用本机 Python 编写您自己的 LZW 解压缩器。

对于 d),您可以在 mathematica.stackexchange.com 上的这个答案中找到我为完成这项工作编写的一些 C 代码。见unlzw()功能。


np8*_*np8 5

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

\n

1)unlzw

\n
    \n
  • GitHub: ionelmc/python-unlzw(最后提交 2017-10)
  • \n
  • PyPI:unlzw
  • \n
  • 文档:python-unlzw.readthedocs.io
  • \n
  • 优点/缺点:该软件包提供了一个C 扩展文件(.so 或 .pyd),这使得它速度更快。缺点是它只构建了 CPython 3.6 的版本(因为它没有维护?),如果你在 Windows 上安装它,pip 将下载.tar.gz,并且你必须安装一个 C 编译器才能使安装才能正常工作。我尝试过,因为我安装了 C 编译器,所以它可以与 CPython 3.8.6 一起使用。
  • \n
\n

1.1) 安装*

\n
pip install unlzw\n
Run Code Online (Sandbox Code Playgroud)\n

*请参阅上面关于优点/缺点的注释。

\n

1.2) 使用示例

\n
pip install unlzw\n
Run Code Online (Sandbox Code Playgroud)\n

2)unlzw3

\n
    \n
  • GitHub:scivision/unlzw3(最后提交时间:2020 年 7 月)。基于github.com/umeat/unlzw
  • \n
  • PyPI:unlzw3
  • \n
  • 优点/缺点:纯 python 实现,这意味着它将在带有 python 的“任何”平台上安装和运行,包括没有 C 编译器的 Windows。它也比 C 实现慢(参见下面的基准)。
  • \n
\n

2.1)安装

\n
pip install unlzw3\n
Run Code Online (Sandbox Code Playgroud)\n

2.2) 使用示例

\n

文档中:

\n
import unlzw3\nfrom pathlib import Path\n\nuncompressed_data = unlzw3.unlzw(Path(\'file.Z\'))\n
Run Code Online (Sandbox Code Playgroud)\n

附录:基准

\n

igsg1450.20i.Z使用从https://cddis.nasa.gov/archive/gnss/products/ionex/2020/145/下载的文件。

\n
unlzw\n3.5 ms \xc2\xb1 93 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\nunlzw3\n166 ms \xc2\xb1 2.7 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

[1] 所有这些实际上都是基于Mark Adler 在 mathematica.stackexchange.com 上的回答

\n