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_dir
nel 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.sep
invece.
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.walk
e 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 open
e close
manualmente. 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' name
argomento 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 tar
può comprimere di solito anche meglio con bzip2
di quanto possa comprimere gzip
.
Le risposte precedenti consigliano di utilizzare il tarfile
modulo Python per creare un .tar.gz
file 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 tar
dell'utilità in Linux. Secondo la mia esperienza questa stima è abbastanza corretta.
Quindi per un'archiviazione più rapida puoi usare il tar
comando usando il subprocess
modulo:
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()}")