wake-up-neo.com

Ich möchte ein Skript für die Entpackung (.tar.gz) über (Python) erstellen.

Ich versuche, ein Skript zum Entpacken aller .tar.gz-Dateien aus Ordnern in einem Verzeichnis zu erstellen. Zum Beispiel habe ich eine Datei, die es aufruft (testing.tar.gz). Wenn ich dies manuell mache, kann ich drücken, um hier zu extrahieren. Dann erstellt die .tar.gz-Datei eine neue Datei und ruft testing.tar auf. Wenn ich den Vorgang des Pressens "hier extrahieren" wiederhole, werden in der .tar-Datei alle .pdf-Dateien angezeigt.

Ich frage mich, wie ich das machen kann, und ich habe meinen Code hier, und es scheint, als würde er nicht funktionieren.

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

Warum möchten Sie ein .tar.gz zweimal "drücken", wenn Sie es einfach einmal tun können? Hier ist ein einfacher Code, um .tar und .tar.gz auf einmal zu extrahieren:

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

Wenn Sie python 3 verwenden, sollten Sie shutil.unpack_archive verwenden, das für die meisten gängigen Archivformate funktioniert.

shutil.unpack_archive (filename [ extract_dir [ format]])

Entpacke ein Archiv. Dateiname ist der vollständige Pfad des Archivs. extract_dir ist der Name des Zielverzeichnisses, in das das Archiv entpackt wird. Wenn nicht angegeben, wird das aktuelle Arbeitsverzeichnis verwendet.

Zum Beispiel:

def extract_all(archives, extract_path):
    for filename in archives:
        shutil.unpack_archive(filename, extract_path)
4
mickours

Hier ist eine einfachere Option:

import envoy # pip install envoy

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

Als ich Ihr Programm ausführte, funktionierte es perfekt für eine tar.gz- und eine .tgz-Datei. Beim Öffnen der Zip-Datei wurden mir nicht die korrekten Elemente angezeigt, aber .tbz war der einzige, der einen Fehler auslöste. Ich denke, Sie haben die falsche Methode zum Entpacken einer .tbz-Datei verwendet, da der Fehler besagte, dass ich einen falschen Dateityp hatte, dies aber nicht tat. Sie können das .Zip-Problem unter anderem lösen, indem Sie uns os.command () verwenden und es mit einer Befehlszeile (je nach Betriebssystem) entpacken, da ein _MACOSX-Ordner mit nichts darin zurückgegeben wurde, obwohl ich den Pfad richtig eingegeben habe. Der einzige andere Fehler, den ich festgestellt habe, war, dass Sie eine falsche Syntax verwendet haben, um einen Fehler auszulösen.
Das hätten Sie verwenden sollen:

raise ValueError("Error message here")

Sie haben ein Komma und keine Klammern verwendet. Hoffe das hilft!

0
Beckett O'Brien

Verwenden des Kontextmanagers:

import tarfile
<another code>
with tarfile.open(os.path.join(os.environ['BACKUP_DIR'],
                  f'Backup_{self.batch_id}.tar.gz'), "r:gz") as so:
    so.extractall(path=os.environ['BACKUP_DIR'])
0
Taras Vaskiv