À l'aide de GZIP Module Python
Je suis en train d'utiliser le Python GZIP module de simplement décompresser plusieurs .gz fichiers dans un répertoire. Notez que je ne veux pas lire les fichiers, seulement les décompresser. Après une recherche sur ce site pendant un certain temps, j'ai ce segment de code, mais il ne fonctionne pas:
import gzip
import glob
import os
for file in glob.glob(PATH_TO_FILE + "/*.gz"):
#print file
if os.path.isdir(file) == False:
shutil.copy(file, FILE_DIR)
# uncompress the file
inF = gzip.open(file, 'rb')
s = inF.read()
inF.close()
l' .gz fichiers sont au bon endroit, et je peux imprimer l'intégralité du chemin + nom de fichier avec la commande d'impression, mais le module GZIP n'est pas exécutée correctement. ce qui me manque?
- Le fichier est ok? Vous ne vous montrez pas ce qui est/n'est pas le cas.
- Oui, le fichier est ok. Je peux décompresser le fichier à l'aide de gunzip sur la ligne de commande UNIX.
Vous devez vous connecter pour publier un commentaire.
Si vous n'obtenez pas d'erreur, le module gzip est probablement exécutée correctement, et le fichier est déjà décompressé.
La définition précise de "décompressé" varie selon le contexte:
La
gzip
module ne fonctionne pas comme un ordinateur de bureau de l'archivage logiciel comme 7-zip, vous ne pouvez pas "décompresser" un fichier sans "lire" il. Notez que la "lecture" (en programmation) habituellement signifie simplement "stockage (temporaire) dans la mémoire RAM de l'ordinateur", pas "d'ouvrir le fichier dans l'interface".Ce que vous probablement dire par "décompresser" (comme dans un bureau de programme d'archivage) est plus précisément décrite (en programmation) "a lire un flux de mémoire/mémoire tampon à partir d'un fichier compressé, et l'écrire dans un nouveau fichier (et éventuellement supprimer le fichier compressé par la suite)"
Avec ces lignes, vous êtes en train de lire le flux de données. Si vous vous attendez à un nouveau "non compressé" fichier doit être créé, vous avez juste besoin d'écrire le contenu du buffer dans un nouveau fichier:
Si vous travaillez avec des fichiers de très grande taille (plus grande que la quantité de mémoire vive), vous aurez besoin d'adopter une approche différente. Mais c'est le sujet pour un autre question.
s
dans votre code?Vous devez utiliser
with
pour ouvrir des fichiers et, bien sûr, stocker le résultat de la lecture du fichier compressé. Voirgzip
de la documentation:Selon ce exactement que vous voulez faire, vous pouvez avoir un coup d'oeil à
tarfile
et ses'r:gz'
option pour ouvrir les fichiers.os.path.splitext(gzip_fname)[0]
pour supprimer le.gz
extensiongzip_fname
n'existe pas, vous devez le modifier pourgzip_path
. En outre, ce que vous obtenez engzip_path
n'est pas un chemin, c'est le fichier gz. Par conséquent, vous devriez changer deos.path.isdir
àos.path.isfile
je pense aussi que pour utiliser @gotson solution est plus agréable 🙂Vous êtes à la décompression de fichier dans
s
variable, et ne rien faire avec elle. Vous devriez arrêter de chercher stackoverflow et de lire au moins tutoriel python. Sérieusement.De toute façon, il y a plusieurs chose de mal avec votre code:
vous avez besoin est de STOCKER de l'décompressé données dans
s
dans un fichier.il n'y a pas besoin de copier le réel
*.gz
fichiers. Parce que dans votre code, vous êtes le déballage de l'original fichier gzip et non pas la copie.vous utilisez
file
, qui est un mot réservé, comme une variable. Ce n'est pasune erreur, juste une très mauvaise pratique.
Cela devrait probablement faire ce que tu voulais:
open(uncompressed_path, 'w').write(s)
sans affecter le gestionnaire de fichier à une variable, il n'est pas nécessaire de fermer le gestionnaire de fichier?with open(...):
J'ai été en mesure de résoudre ce problème en utilisant le sous-processus module:
Depuis mon but était simplement de décompresser l'archive, le code ci-dessus accomplit ce. Les fichiers archivés sont situés dans un emplacement central, et sont copiées dans une zone de travail, non compressé, et utilisé dans un cas de test. le module GZIP était trop compliqué pour ce que je tente d'accomplir.
Merci pour l'aide de tous. C'est très apprécié!
Je pense qu'il y a une solution beaucoup plus simple que les autres présentées compte tenu de l'op voulait seulement d'extraire tous les fichiers dans un répertoire:
import shutil; print(shutil.get_archive_formats())