Risposte:
Per creare un .tar.gz(aka .tgz) per un intero albero di directory:
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))
Questo creerà un archivio tar compresso con gzip contenente una singola cartella di primo livello con lo stesso nome e contenuto di source_dir.
arcname=os.path.basename(source_dir), ti darà l'intera struttura del percorso source_dirnel file tar (nella maggior parte delle situazioni, è probabilmente scomodo).
arcname=os.path.basename(source_dir)significa ancora che l'archivio contiene una cartella che contiene il contenuto di source_dir. Se vuoi che la radice dell'archivio contenga i contenuti stessi e non i contenuti all'interno di una cartella, usa arcname=os.path.sepinvece.
os.path.sep, l'archivio conterrà il servizio "." o la cartella "/" che di solito non è un problema, ma a volte può essere un problema se successivamente si elabora questo archivio a livello di programmazione. Sembra che l'unico vero modo pulito sia quello di fare os.walke aggiungere file individualmente
arcname='.'. Non c'è bisogno di usare os.walk.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Se vuoi creare un file compresso tar.bz2, sostituisci semplicemente il nome dell'estensione del file con ".tar.bz2" e "w: gz" con "w: bz2".
with tarfile.open( ..in Python, invece di chiamare opene closemanualmente. Questo è anche il caso dell'apertura di file regolari.
Chiami tarfile.open con mode='w:gz', che significa "Apri per la scrittura compressa gzip".
Probabilmente vorrai terminare il nome del file (l' nameargomento a open) con .tar.gz, ma ciò non influisce sulle capacità di compressione.
A proposito, di solito ottieni una compressione migliore con una modalità di 'w:bz2', proprio come tarpuò comprimere di solito anche meglio con bzip2di quanto possa comprimere gzip.
Le risposte precedenti consigliano di utilizzare il tarfilemodulo Python per creare un .tar.gzfile in Python. Questa è ovviamente una buona soluzione in stile Python, ma ha un serio svantaggio nella velocità di archiviazione. Questa domanda indica che tarfileè circa due volte più lenta tardell'utilità in Linux. Secondo la mia esperienza questa stima è abbastanza corretta.
Quindi per un'archiviazione più rapida puoi usare il tarcomando usando il subprocessmodulo:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
In questo file tar.gz comprimi nella directory di visualizzazione aperta In risoluzione usa 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))
il suo utilizzo nel file tar.gz compress nella directory
Oltre alla risposta di @Aleksandr Tukallo, potresti anche ottenere l'output e il messaggio di errore (se si verifica). La compressione di una cartella utilizzando tarè spiegata abbastanza bene nella seguente risposta .
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()}")