Como os arquivos podem ser adicionados a um Tarfile com Python, sem adicionar a hierarquia do diretório?
Pergunta
Quando eu invoco add()
com um tarfile
Objeto com um caminho de arquivo, o arquivo é adicionado ao Tarball com a hierarquia de diretório associada. Em outras palavras, se eu descompactar o Tarfile, os diretórios na hierarquia de diretórios originais serão reproduzidos.
Existe uma maneira de simplesmente adicionar um arquivo simples sem informações de diretório que incapaz do tarball resultante produz uma lista plana de arquivos?
Solução
You can use tarfile.addfile()
, in the TarInfo
object, which is the first parameter, you can specify a name
that's different from the file you're adding.
This piece of code should add /path/to/filename
to the TAR file but will extract it as myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
Outras dicas
The arch argument of TarFile.add() method is an alternate and convenient way to match your destination.
Example: you want to archive a dir repo/a.git/ to a tar.gz file, but you rather want the tree root in the archive begins by a.git/ but not repo/a.git/, you can do like followings:
archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()
Maybe you can use the "arcname" argument to TarFile.add(name, arcname). It takes an alternate name that the file will have inside the archive.
thanks to @diabloneo, function to create selective tarball of a 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"])