Réponses:
Pour créer un .tar.gz
(aka .tgz
) pour une arborescence de répertoires entière:
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))
Cela créera une archive tar gzippée contenant un seul dossier de niveau supérieur avec le même nom et le même contenu que source_dir
.
arcname=os.path.basename(source_dir)
cela vous donnera la structure de chemin complète du source_dir
fichier tar (dans la plupart des situations, c'est probablement gênant).
arcname=os.path.basename(source_dir)
encore signifie que l'archive contient un dossier contenant le contenu de source_dir
. Si vous souhaitez que la racine de l'archive contienne le contenu proprement dit, et non le contenu d'un dossier, utilisez à la arcname=os.path.sep
place.
os.path.sep
, l'archive contiendra le service "." ou dossier "/" qui n'est généralement pas un problème, mais parfois cela peut être un problème si vous traitez ultérieurement cette archive par programme. Il semble que le seul moyen vraiment propre est de faire os.walk
et d'ajouter des fichiers individuellement
arcname='.'
. Pas besoin d'utiliser os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Si vous souhaitez créer un fichier compressé tar.bz2, remplacez simplement le nom de l'extension de fichier par ".tar.bz2" et "w: gz" par "w: bz2".
with tarfile.open( ..
en Python, au lieu d'appeler open
et close
manuellement. C'est également le cas lors de l'ouverture de fichiers normaux.
Vous appelez tarfile.open avecmode='w:gz'
, ce qui signifie «Ouvrir pour l'écriture compressée gzip».
Vous voudrez probablement terminer le nom de fichier (l' name
argument vers open
) par .tar.gz
, mais cela n'affecte pas les capacités de compression.
BTW, vous obtenez généralement une meilleure compression avec un mode de 'w:bz2'
, tout comme tar
peut généralement compresser encore mieux avec bzip2
qu'il ne peut compresser avec gzip
.
Les réponses précédentes conseillent d'utiliser le tarfile
module Python pour créer un.tar.gz
fichier en Python. C'est évidemment une bonne solution de style Python, mais elle présente un sérieux inconvénient en termes de rapidité d'archivage. Cette question mentionne que tarfile
c'est environ deux fois plus lent que l' tar
utilitaire sous Linux. D'après mon expérience, cette estimation est assez correcte.
Donc, pour un archivage plus rapide, vous pouvez utiliser la tar
commande en utilisant le subprocess
module:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
Dans ce fichier tar.gz, compressez dans le répertoire de vue ouvert. Dans la résolution, utilisez 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))
son utilisation dans le fichier tar.gz compresser dans le répertoire
En plus de la réponse de @Aleksandr Tukallo, vous pouvez également obtenir la sortie et le message d'erreur (le cas échéant). La compression d'un dossier en utilisant tar
est assez bien expliquée dans la réponse suivante .
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()}")