/ Entpacken einer .Z-Datei mit Python - python, zlib, dekomprimieren

Dekomprimieren einer .Z-Datei mit Python - python, zlib, dekomprimieren

Ich versuche eine * .Z-Datei mit Python zu dekomprimieren. Ich habe es über FTP (Binärmodus) heruntergeladen. Die Datei dekomprimiert sich erfolgreich mit 7zip (wessen "Info" in der Datei sagt es ist vom Typ "Z"). Die ursprüngliche Datei kann bei gefunden werden ftp://cddis.gsfc.nasa.gov/gps/products/1860/igr18600.sp3.Z.

Ich habe über die Verwendung des zlib-Moduls in Python gelesen und habe einen Testcode, den ich benutze:

import zlib

comp_data = open("C:Tempigr18600.sp3.Z", "rb").read()

print(comp_data[0:10])

uncomp_data = zlib.decompress(comp_data)
with open("c:tempigr18600.sp3", "wb") as f:
f.write(uncomp_data)
f.close()

Wenn ich das ausführe bekomme ich folgende Ausgabe:

b"x1fx9dx90#xc6@x91x01#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 mag die Kopfzeile offensichtlich nicht. Die ersten paar Bytes scheinen der richtigen magischen Zahlenfolge 0x1F9d für eine komprimierte Datei (per https://en.wikipedia.org/wiki/List_of_file_signatures).

Zur Not kann ich das umgehen, indem ich ausschüttedirekt 7zip. Aber ich hatte gehofft, eine reine Python-Antwort zu finden. Obwohl ich den größten Teil des Tages damit verbracht habe, nach einer Antwort zu suchen (oder nach dieser Fehlermeldung), hatte ich nicht viel Glück. Vielleicht sind meine Suchfähigkeiten verkümmern?

Antworten:

1 für die Antwort № 1

Python hat nicht das Äquivalent von Unixdekomprimieren Sie eine .Z-Datei. Sie müssten entweder a) den Unix-Befehl compress ausführen, b) shell out für gzip, c) shell out für 7-zip (Sowohl gzip als auch 7-zip können Z-Dateien dekomprimieren), d) den ursprünglichen Dekomprimierungscode in C ändern und mit Python verknüpfen (der Code ist online verfügbar) oder e) einen eigenen LZW-Dekompressor in nativem Python schreiben .

Für d) können Sie einen C-Code finden, den ich für diesen Job geschrieben habe in dieser Antwort auf mathematica.stackexchange.com. Siehe die unlzw() Funktion.