web-dev-qa-db-fra.com

Comment ajouter des fichiers à un fichier tar avec Python, sans ajouter la hiérarchie des répertoires?

Lorsque j'appelle add() sur un objet tarfile avec un chemin de fichier, le fichier est ajouté à l'archive tar avec la hiérarchie de répertoires associée. En d'autres termes, si je décompresse le fichier tar, les répertoires de la hiérarchie des répertoires d'origine sont reproduits.

Existe-t-il un moyen d'ajouter simplement un fichier brut sans informations de répertoire pour que la décompression de l'archive tar résultante produise une liste plate de fichiers?

52
theactiveactor

Vous pouvez utiliser tarfile.addfile() , dans l'objet TarInfo , qui est le premier paramètre, vous pouvez spécifier un name c'est différent du fichier que vous ajoutez.

Ce morceau de code devrait ajouter /path/to/filename dans le fichier TAR mais l'extrayera sous la forme myfilename:

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
43
Wim

L'argument Arch de la méthode TarFile.add () est un moyen alternatif et pratique de faire correspondre votre destination.

Exemple: vous souhaitez archiver un répertoire repo/a.git/ dans un tar.gz , mais vous voulez plutôt que la racine de l'arbre dans l'archive commence par a.git/ mais pas repo/a.git/, vous pouvez faire comme suit:

archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()
63
diabloneo

Vous pouvez peut-être utiliser l'argument "arcname" pour TarFile.add (nom, arcname). Il faut un autre nom que le fichier aura à l'intérieur de l'archive.

6
Lauro Moura

grâce à @diabloneo, fonction pour créer un tarball sélectif d'un dir

def compress(output_file="archive.tar.gz", output_dir='', root_dir='.', items=[]):
    """compress dirs.

    KWArgs
    ------
    output_file : str, default ="archive.tar.gz"
    output_dir : str, default = ''
        absolute path to output
    root_dir='.',
        absolute path to input root dir
    items : list
        list of dirs/items relative to root dir

    """
    os.chdir(root_dir)
    with tarfile.open(os.path.join(output_dir, output_file), "w:gz") as tar:
        for item in items:
            tar.add(item, arcname=item)    


>>>root_dir = "/abs/pth/to/dir/"
>>>compress(output_file="archive.tar.gz", output_dir=root_dir, 
            root_dir=root_dir, items=["logs", "output"])
2
muon