La décompression de la partie de .gz fichier à l'aide de python
Alors, voici le problème. J'ai sample.gz fichier qui est d'environ 60 MO en taille. Je veux décompresser les 2000 premiers octets de ce fichier. Je suis en cours d'exécution en vérifier le CRC a échoué erreur, j'imagine, parce que le gzip CRC champ apparaît à la fin du fichier, et il exige de l'ensemble de format de fichier pour le décompresser. Est-il un moyen de contourner ce problème? Je ne m'inquiète pas à propos de la vérification CRC. Même si je n'arrive pas à décompresser en raison de mauvais CRC, c'est OK. Est-il un moyen de contourner ce problème et décompressez partielle .les fichiers gz?
Le code que j'ai pour l'instant est
import gzip
import time
import StringIO
file = open('sample.gz', 'rb')
mybuf = MyBuffer(file)
mybuf = StringIO.StringIO(file.read(2000))
f = gzip.GzipFile(fileobj=mybuf)
data = f.read()
print data
L'erreur rencontrée est
File "gunzip.py", line 27, in ?
data = f.read()
File "/usr/local/lib/python2.4/gzip.py", line 218, in read
self._read(readsize)
File "/usr/local/lib/python2.4/gzip.py", line 273, in _read
self._read_eof()
File "/usr/local/lib/python2.4/gzip.py", line 309, in _read_eof
raise IOError, "CRC check failed"
IOError: CRC check failed
Aussi est-il possible d'utiliser la librairie zlib module pour ce faire et ignorer le gzip-têtes?
OriginalL'auteur user210126 | 2009-11-14
Vous devez vous connecter pour publier un commentaire.
Je semble que vous avez besoin de regarder dans Python zlib bibliothèque au lieu
Le GZIP format s'appuie sur zlib, mais introduit un fichier de compression au niveau du concept avec le CRC de la vérification, et cela semble être ce que vous ne voulez/besoin en ce moment.
Voir, par exemple, ces des extraits de code à partir d'une Pâte Hellman
Modifier: le code de la Doubh Hellman site seulement montrer comment compresser ou décompresser avec zlib. Comme indiqué ci-dessus, GZIP est "zlib avec une enveloppe", et vous aurez besoin de décoder l'envellope avant d'arriver à la zlib-données compressées soi. Voici plus d'infos à aller à ce sujet, c'est vraiment pas compliqué:
Désolé pour fournir ni une simple procédure, ni d'un prêt-à-go extrait, cependant le décodage du fichier avec l'indication ci-dessus devrait être relativement simple et rapide.
Vérifier mon montage; les extraits de code se rapportent à la compression/décompression vers/à partir de pur zlib. Le GZip format implique poing de l'analyse d'un petit, non compressé en-tête, avant de trouver sa zlip "charge", qui peut être décompressé comme indiqué.
OriginalL'auteur mjv
Le problème avec le module gzip n'est pas qu'il ne peut pas décompresser le fichier partiel, l'erreur ne se produit qu'à la fin quand il essaie de vérifier la somme de contrôle du contenu décompressé. (L'original de la somme de contrôle est stockée à la fin du fichier compressé de sorte que la vérification ne seront jamais, jamais travailler avec un fichier partiel.)
La clé est de tromper gzip en sautant de la vérification. Le réponse par caesar0301 le fait en modifiant le gzip code source, mais il n'est pas nécessaire d'aller jusque-là, simple monkey patching fera. J'ai écrit ce contexte, le gestionnaire de remplacer temporairement
gzip.GzipFile._read_eof
alors que je décompresse le fichier partiel:Un exemple d'utilisation:
OriginalL'auteur jiffyclub
Je ne vois aucune raison possible pour laquelle vous souhaitez décompresser les 2000 premiers octets compressés. Selon les données, ce qui peut décompresser à un nombre quelconque d'octets de sortie.
Vous voulez sûrement pour décompresser le fichier, et arrêtez-vous quand vous avez décompressé autant de fichier que vous avez besoin, quelque chose comme:
Autant que je sache, ce ne sera pas causer de l'ensemble du fichier à lire. Il ne lire autant que nécessaire pour obtenir la première 4000 octets.
Pourquoi? Ce qui sur terre est votre demande?
🙂 Je suis en train d'essayer de trouver de la chaîne "xyz" dans la première 4k de données. En supposant que je décompresse 2K de format de données et de la terre avec 4K de décompressé de données, je peux rechercher/grep dans ce 4k pour la chaîne. Tous à la recherche de code est déjà en place..
Si vous souhaitez rechercher la première 4k de données non compressées, de recherche, de la première 4k de données non compressées, comme je le fais dans ma réponse (peut-être le changer 4000 4096). N'essayez pas de deviner que 2k décompresser 4k. Il ne peut pas. Il ne peut décompresser juste 2k, ou il peut décompresser pour un couple de méga-octets.
C'est parfait. Merci beaucoup! Pas besoin de sale hacks.
OriginalL'auteur rjmunro
J'ai également rencontrer ce problème lorsque j'utilise mon script python pour lire des fichiers compressés généré par gzip outil sous Linux et les fichiers originaux ont été perdus.
Par la lecture de la mise en œuvre de gzip.py de Python, j'ai trouvé que gzip.GzipFile avaient les mêmes méthodes de la classe File et exploités python zip du module de données de processus de compression. Dans le même temps, la _read_eof() la méthode est également présent afin de vérifier le CRC de chaque fichier.
Mais dans certaines situations, comme les Flux de traitement ou de .fichier gz sans corriger CRC (mon problème), un IOError("vérifier le CRC a échoué") sera porté par _read_eof(). Donc, j'ai essayer de modifier le module gzip pour désactiver la vérification CRC et, enfin, ce problème a disparu.
https://github.com/caesar0301/PcapEx/blob/master/live-scripts/gzip_mod.py
Je sais que c'est une force brute solution, mais c'est économiser beaucoup de temps à réécrire-vous le faible niveau des méthodes utilisant le zip du module, à l'instar de la lecture des données par chuck chuck de le fichiers zip et d'extraire les données ligne par ligne, la plupart de ce qui a été présent dans le module gzip.
Jamin
OriginalL'auteur caesar0301