Respostas:
Para construir um .tar.gz
(aka .tgz
) para uma árvore de diretório inteira:
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))
Isso criará um arquivo tar compactado com gzip contendo uma única pasta de nível superior com o mesmo nome e conteúdo que source_dir
.
arcname=os.path.basename(source_dir)
, ele fornecerá toda a estrutura do caminho do source_dir
arquivo tar (na maioria das situações, isso é provavelmente inconveniente).
arcname=os.path.basename(source_dir)
ainda significa que o arquivo contém uma pasta que contém o conteúdo de source_dir
. Se quiser que a raiz do arquivo contenha o conteúdo em si, e não o conteúdo de uma pasta, use arcname=os.path.sep
.
os.path.sep
, o arquivo conterá o serviço "." ou a pasta "/" que normalmente não é um problema, mas às vezes pode ser um problema se você processar este arquivo programaticamente posteriormente. Parece que a única maneira realmente limpa é fazer os.walk
e adicionar arquivos individualmente
arcname='.'
. Não há necessidade de usar os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Se você deseja criar um arquivo compactado tar.bz2, basta substituir o nome da extensão do arquivo por ".tar.bz2" e "w: gz" por "w: bz2".
with tarfile.open( ..
em Python, em vez de chamar open
e close
manualmente. Este também é o caso ao abrir arquivos normais.
Você chama tarfile.open commode='w:gz'
, que significa "Abrir para gravação compactada gzip."
Você provavelmente vai querer terminar o nome do arquivo (o name
argumento para open
) com.tar.gz
, mas isso não afeta as habilidades de compactação.
BTW, você geralmente obtém uma melhor compactação com um modo de 'w:bz2'
, assim como tar
geralmente pode compactar ainda melhor com bzip2
do que com gzip
.
As respostas anteriores aconselham o uso do tarfile
módulo Python para criar um .tar.gz
arquivo em Python. Obviamente, essa é uma boa solução no estilo Python, mas tem uma séria desvantagem na velocidade de arquivamento. Esta questão menciona que tarfile
é aproximadamente duas vezes mais lento que otar
utilitário do Linux. De acordo com minha experiência, essa estimativa é bastante correta.
Portanto, para um arquivamento mais rápido, você pode usar o tar
comando using subprocess
module:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
Além da resposta de @Aleksandr Tukallo, você também pode obter a saída e a mensagem de erro (se ocorrer). A compactação de uma pasta usando tar
é explicada muito bem na resposta a seguir .
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()}")