Распаковка файла.Z с помощью Python

Я пытаюсь распаковать файл *.Z с помощью Python. Я скачал его через FTP (бинарный режим). Файл успешно распаковывается с помощью 7zip (чья "информация" в файле говорит, что он имеет тип "Z"). Оригинальный файл можно найти по адресу ftp://cddis.gsfc.nasa.gov/gps/products/1860/igr18600.sp3.Z.

Я прочитал об использовании модуля zlib в Python и у меня есть тестовый код, который я использую:

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. Несмотря на то, что большую часть дня я потратил на поиски ответа (или сообщения об ошибке), мне не повезло. Возможно, мои навыки поиска атрофируются?

1 ответ

Решение

Python не имеет эквивалента Unix Uncompress, доступного в модуле, что вам нужно для распаковки.Z файла. Вам либо нужно: а) выполнить оболочку для команды сжатия Unix, б) выполнить оболочку для gzip, в) оболочку для 7-zip (и gzip, и 7-zip могут распаковывать файлы.Z), d) изменить исходный код распаковки на C и связать его с Python (код доступен онлайн), или e) написать собственный декомпрессор LZW на нативном Python.

Для d) вы можете найти код C, который я написал для этой работы, /questions/39288696/praktika-kontrolya-versij/39288726#39288726. Увидеть unlzw() функция.

Прошло несколько лет, и теперь для этого есть пакет python: unlzw(который фактически основан на ответе Марка Адлера на 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)
Другие вопросы по тегам