Come creare un file tar compresso completo usando Python?


Risposte:


186

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.


31
Proprio come una nota per i lettori, se la tralascia arcname=os.path.basename(source_dir), ti darà l'intera struttura del percorso source_dirnel file tar (nella maggior parte delle situazioni, è probabilmente scomodo).
Brōtsyorfuzthrāx

12
Una seconda nota; usare 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.
Jonathan H

2
@Sheljohn sfortunatamente, questo non è del tutto corretto, perché se uno usa 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
Il Padrino

Per sbarazzarsi di tutta la struttura delle directory, basta usare arcname='.'. Non c'è bisogno di usare os.walk.
edouardtheron

85
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".


10
Dovresti davvero usare with tarfile.open( ..in Python, invece di chiamare opene closemanualmente. Questo è anche il caso dell'apertura di file regolari.
Jonathan H

31

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.


6
Solo una breve nota che il nome del file per i tarball compressi con bzip2 dovrebbe terminare con ".tar.bz2".
Ignacio Vazquez-Abrams

8

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])

0

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


0

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()}")       
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.