Antworten:
So erstellen Sie ein .tar.gz
(aka .tgz
) für einen gesamten Verzeichnisbaum:
import tarfile
import os.path
def make_tarfile(output_filename, source_dir):
with tarfile.open(output_filename, "w:gz") as tar:
tar.add(source_dir, arcname=os.path.basename(source_dir))
Dadurch wird ein komprimiertes Teerarchiv erstellt, das einen einzelnen Ordner der obersten Ebene mit demselben Namen und Inhalt wie enthält source_dir
.
arcname=os.path.basename(source_dir)
weglassen, erhalten Sie die gesamte Pfadstruktur source_dir
in der TAR-Datei (in den meisten Situationen ist dies wahrscheinlich unpraktisch).
arcname=os.path.basename(source_dir)
still bedeutet, dass das Archiv einen Ordner enthält, der den Inhalt von enthält source_dir
. Wenn Sie möchten, dass das Stammverzeichnis des Archivs den Inhalt selbst und nicht den Inhalt eines Ordners enthält, verwenden Sie arcname=os.path.sep
stattdessen.
os.path.sep
, dann enthält das Archiv den Dienst "." oder "/" Ordner, was normalerweise kein Problem ist, aber manchmal kann es ein Problem sein, wenn Sie dieses Archiv später programmgesteuert verarbeiten. Es scheint der einzig wirklich saubere Weg zu sein os.walk
, Dateien einzeln zu erstellen und hinzuzufügen
arcname='.'
. Keine Notwendigkeit zu verwenden os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Wenn Sie eine komprimierte tar.bz2-Datei erstellen möchten, ersetzen Sie einfach den Namen der Dateierweiterung durch ".tar.bz2" und "w: gz" durch "w: bz2".
with tarfile.open( ..
in Python verwenden, anstatt aufzurufen open
und close
manuell. Dies ist auch beim Öffnen regulärer Dateien der Fall.
Sie rufen tarfile.open mit auf mode='w:gz'
, was "Offen für gzip-komprimiertes Schreiben" bedeutet.
Sie möchten wahrscheinlich den Dateinamen (das name
Argument zu open
) mit beenden .tar.gz
, dies hat jedoch keine Auswirkungen auf die Komprimierungsfähigkeiten.
Übrigens erhalten Sie normalerweise eine bessere Komprimierung mit einem Modus von 'w:bz2'
, genau wie Sie normalerweise noch besser komprimieren tar
können bzip2
als mit gzip
.
In früheren Antworten wird empfohlen, das tarfile
Python-Modul zum Erstellen einer .tar.gz
Datei in Python zu verwenden. Das ist natürlich eine gute Lösung im Python-Stil, hat aber einen gravierenden Nachteil in der Geschwindigkeit der Archivierung. In dieser Frage wird erwähnt, dass dies tarfile
ungefähr zweimal langsamer ist als das tar
Dienstprogramm unter Linux. Nach meiner Erfahrung ist diese Einschätzung ziemlich richtig.
Für eine schnellere Archivierung können Sie den tar
Befehl mithilfe des subprocess
Moduls verwenden:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
In dieser tar.gz-Datei im geöffneten Ansichtsverzeichnis komprimieren Verwenden Sie zum Lösen os.path.basename (file_directory).
with tarfile.open("save.tar.gz","w:gz"):
for file in ["a.txt","b.log","c.png"]:
tar.add(os.path.basename(file))
seine Verwendung in der Datei tar.gz komprimieren im Verzeichnis
Zusätzlich zur Antwort von @Aleksandr Tukallo können Sie auch die Ausgabe- und Fehlermeldung erhalten (falls dies auftritt). Das Komprimieren eines Ordners mit tar
wird in der folgenden Antwort ziemlich gut erklärt .
import traceback
import subprocess
try:
cmd = ['tar', 'czfj', output_filename, file_to_archive]
output = subprocess.check_output(cmd).decode("utf-8").strip()
print(output)
except Exception:
print(f"E: {traceback.format_exc()}")