Come possono i file essere aggiunti a un tarfile con Python, senza aggiungere la gerarchia di directory?

StackOverflow https://stackoverflow.com/questions/2239655

  •  19-09-2019
  •  | 
  •  

Domanda

Quando invoco add() su un oggetto tarfile con un percorso di file, il file viene aggiunto alla tarball con la gerarchia di directory associata. In altre parole, se io decomprimere il file tar le directory nella gerarchia delle directory originale vengono riprodotti.

C'è un modo per aggiungere semplicemente un file normale senza informazioni di directory che scompattando il tarball risultante produce una semplice lista di file?

È stato utile?

Soluzione

È possibile utilizzare tarfile.addfile() , nel oggetto TarInfo , che è il primo parametro, è possibile specificare un name che è diverso dal file che si salvando.

Questo pezzo di codice dovrebbe aggiungere /path/to/filename al file TAR, ma estrarrà come myfilename:

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

Altri suggerimenti

Il arch argomento del TarFile.add () il metodo è un'alternativa e un modo conveniente per abbinare la vostra destinazione.

Esempio: si desidera archiviare una directory repo / a.git / in un file tar.gz , ma si desidera invece la radice dell'albero in archivio inizia a.git / , ma non repo / a.git / , si può fare come segue:

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

Forse si può usare l'argomento "arcname" per TarFile.add (nome, arcname). Si prende un nome alternativo che il file avrà all'interno dell'archivio.

grazie @diabloneo, funzione per creare tarball selettiva di 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"])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top