Obtenir la taille non compressée d'un .gz fichier en python
À l'aide de gzip, tell() retourne l'offset dans le fichier non compressé.
Pour afficher une barre de progression, je veux savoir l'origine (non compressé) la taille du fichier.
Est-il un moyen facile de trouver?
Vous devez vous connecter pour publier un commentaire.
La gzip format spécifie un champ appelé
ISIZE
que:Dans gzip.py, ce qui je suppose est ce que vous êtes à l'aide de gzip, il existe une méthode appelée
_read_eof
définie comme suit:Là vous pouvez voir que le
ISIZE
domaine est en cours de lecture, mais seulement de le comparer àself.size
pour la détection des erreurs. Ensuite, cela devrait signifier queGzipFile.size
magasins de la réelle taille non compressée. Cependant, je pense ce n'est pas exposée au public, de sorte que vous pourriez avoir à le pirater en de les exposer. Pas si sûr, désolé.Je viens de regarder tout cela en place dès maintenant, et je n'ai pas essayé donc je peux me tromper. J'espère que c'est de quelque utilité pour vous. Désolé si j'ai mal compris votre question.
La taille non compressée est stocké dans les 4 derniers octets du fichier gzip. On peut lire les données binaires et les convertir en int. (Cela ne fonctionne que pour les fichiers de moins de 4 GO)
"rb"
pour évitererror: unpack requires a string argument of length 4
.D'Unix: utilisation de "gunzip -l file.gz" par l'intermédiaire de sous-processus.appel /os.popen, de capturer et d'analyser sa sortie.
Les 4 derniers octets de l' .gz maintenez la taille originale du fichier
Je ne suis pas sûr à propos de la performance, mais cela pourrait être réalisé sans le savoir
gzip
de la magie à l'aide de:Cela devrait également fonctionner pour les autres (compressé) flux de lecteurs comme
bz2
ou de la plaineopen
.EDIT:
comme suggéré dans les commentaires,
2
en deuxième ligne a été remplacé pario.SEEK_END
, qui est certainement plus lisible et probablement plus à l'avenir.EDIT:
Fonctionne uniquement en Python 3.
file_size = file_obj.seek(0, io.SEEK_END)
ValueError: Seek from end not supported
. Cependant: struct.déballez travaux sur les 2,7!En dépit de ce que les autres réponses-dire, les quatre derniers octets ne sont pas un moyen fiable pour obtenir la non compressé de la longueur d'un fichier gzip. Tout d'abord, il peut y avoir plusieurs membres dans le fichier gzip, de sorte que ne serait la longueur du dernier membre. Deuxièmement, la longueur peut être de plus de 4 GO, auquel cas les quatre derniers octets représentent la longueur modulo 232. Pas la longueur.
Cependant pour ce que vous voulez, il n'est pas nécessaire pour obtenir le non compressé longueur. Vous pouvez à la place de la base de votre barre de progression sur le montant de entrée consommé, par rapport à la longueur du fichier gzip, qui est facilement obtenu. Pour le type de données homogènes, que la barre de progression ne montrent exactement la même chose qu'une barre de progression basée sur les données non compressées.
En regardant la source de la
gzip
module, je vois que le fichier sous-jacent de l'objet pourGzipFile
semble êtrefileobj
. Donc:?
Peut-être qu'il serait bon de faire certaines vérifications avant de faire cela, comme vérifier que l'attribut existe avec
hasattr
.Pas exactement une API publique, mais...
GzipFile.les magasins de taille la taille non compressée, mais c'est seulement incrémenté lorsque vous lisez le fichier, de sorte que vous devriez préférer len(fd.read()) au lieu de la non-public GzipFile.la taille de l'.