Come possono i file essere aggiunti a un tarfile con Python, senza aggiungere la gerarchia di directory?
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?
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"])