Распаковка файла.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)