2015-10-03 3 views
2

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

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

+0

Ссылка также упоминает о '7-Zip File Format' как' 37 7A BC AF 27 1C'. –

ответ

1

У Python нет эквивалента Unix-сжатия, доступного в модуле, что вам нужно для распаковки .Z-файла. Вам понадобится либо a) оболочка для команды сжатия Unix, b) shell out to gzip, c) shell out to 7-zip (оба gzip и 7-zip имеют возможность распаковывать .Z-файлы), d) изменять исходный код uncompress в C и ссылку на Python (код доступен в Интернете) или e) напишите свой собственный декомпрессор LZW в родном Python.

Для d) вы можете найти код C, который я написал для этой работы in this answer on mathematica.stackexchange.com. См. Функцию unlzw().

+1

Спасибо, Марк. Цените всю свою тяжелую работу в zlib. Приятно было слышать, что мне не хватает чего-то очевидного. На данный момент я выложу 7-zip и начну расследование d и e для собственного назидания. –

+3

Я пошел с опцией e. Спасибо за вашу помощь, Марк. https://github.com/umeat/unlzw – unclemeat

+0

@unclemeat, спасибо за решение чистой реализации python. Я дам вам попробовать и для моего приложения. –