/ / Décompression d’un fichier .Z avec Python - python, zlib, décompresser

Décompresser un fichier .Z avec Python - python, zlib, uncompress

J'essaie de décompresser un fichier * .Z en utilisant Python. Je l'ai téléchargé via FTP (mode binaire). Le fichier est décompressé avec succès avec 7zip (dont "info" le dit "s de type" Z ftp://cddis.gsfc.nasa.gov/gps/products/1860/igr18600.sp3.Z.

J'ai lu sur l'utilisation du module zlib en Python et j'ai du code de test I "m using:

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()

Quand j'exécute ceci, j'obtiens la sortie suivante:

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 ne ressemble clairement pas à l’en-tête. Les deux premiers octets semblent correspondre à la séquence de nombres magiques appropriée 0x1F9d pour un fichier compressé https://en.wikipedia.org/wiki/List_of_file_signatures).

À la rigueur, je peux contourner cela en bombardantà 7zip directement. Mais j'espérais trouver un type de réponse purement Python. Malgré avoir passé la majeure partie de la journée à chercher une réponse sur Google (ou ce message d’erreur), je n’ai pas eu beaucoup de chance. Peut-être que mes compétences en matière de recherche s’atrophient?

Réponses:

1 pour la réponse № 1

Python n'a pas l'équivalent d'Unixdécompressez disponible dans un module, ce qui est nécessaire pour "décompresser un fichier .Z. Vous devez soit utiliser un shell pour exécuter la commande de compression Unix, b) utiliser un shell pour gzip, c) utiliser un shell jusqu'à 7-zip (gzip et 7-zip ont la capacité de décompresser les fichiers .Z), d) modifier le code de décompression original en C et le lier à Python (le code est disponible en ligne), ou e) écrire votre propre décompresseur LZW en langage Python natif .

Pour d), vous pouvez trouver du code C que j’ai écrit pour faire ce travail dans cette réponse sur mathematica.stackexchange.com. Voir le unlzw() fonction.