web-dev-qa-db-fra.com

Je veux créer un script pour décompresser un fichier (.tar.gz) via (Python)

J'essaie de faire un script pour décompresser tous les fichiers .tar.gz de dossiers dans un répertoire. Par exemple, j'aurai un fichier qu'il appelle (testing.tar.gz). Ensuite, si je le fais manuellement, je peux appuyer sur pour "extraire ici", puis le fichier .tar.gz crée un nouveau fichier et appelle testing.tar. Enfin, si je répète le processus consistant à appuyer sur «extraire ici», le fichier .tar me produira tous les fichiers .pdf.

Je me demande comment je peux le faire, et j'ai mon code ici et il semble que ça ne marche pas vraiment.

import os
import tarfile
import zipfile

def extract_file(path, to_directory='.'):
    if path.endswith('.Zip'):
        opener, mode = zipfile.ZipFile, 'r'
    Elif path.endswith('.tar.gz') or path.endswith('.tgz'):
        opener, mode = tarfile.open, 'r:gz'
    Elif path.endswith('.tar.bz2') or path.endswith('.tbz'):
        opener, mode = tarfile.open, 'r:bz2'
    else: 
        raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path

    cwd = os.getcwd()
    os.chdir(to_directory)

    try:
        file = opener(path, mode)
        try: file.extractall()
        finally: file.close()
    finally:
        os.chdir(cwd)
27
Alex

Pourquoi voulez-vous "appuyer" deux fois pour extraire un fichier .tar.gz, alors que vous pouvez le faire facilement une fois? Voici un code simple pour extraire les fichiers .tar et .tar.gz en une fois:

import tarfile
if (fname.endswith("tar.gz")):
    tar = tarfile.open(fname, "r:gz")
    tar.extractall()
    tar.close()
Elif (fname.endswith("tar")):
    tar = tarfile.open(fname, "r:")
    tar.extractall()
    tar.close()
46
Lye Heng Foo

Voici une option plus simple:

import envoy # pip install envoy

def tar_xzf(f):
   r = envoy.run("tar xzf %s -C %s" % (f, "directory"))
1
ehsan

Lorsque j’exécutais votre programme, il fonctionnait parfaitement pour un fichier tar.gz et un fichier .tgz. Il ne m’a pas donné les bons éléments lors de l’ouverture du fichier Zip, mais .tbz a été le seul à générer une erreur. Je pense que vous avez utilisé la mauvaise méthode pour décompresser un fichier .tbz car l'erreur indiquait que mon type de fichier était incorrect, mais ce n'est pas le cas. Pour résoudre le problème .Zip, nous pouvons utiliser os.command () et le décompresser avec une ligne de commande (selon votre système d’exploitation), car il a renvoyé un dossier _MACOSX dans lequel il ne contient rien, même si j’ai entré correctement le chemin. La seule autre erreur que j'ai rencontrée est que vous avez utilisé une syntaxe incorrecte pour générer une erreur .
Voici ce que vous auriez dû utiliser:

raise ValueError("Error message here")

Vous avez utilisé une virgule et pas de parenthèse. J'espère que cela t'aides!

0
Beckett O'Brien