Respuestas:
Para construir un .tar.gz
(alias .tgz
) para un árbol de directorios completo:
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))
Esto creará un archivo tar comprimido con gzip que contiene una única carpeta de nivel superior con el mismo nombre y contenido que source_dir
.
arcname=os.path.basename(source_dir)
, le dará la estructura de ruta completa del source_dir
archivo tar (en la mayoría de las situaciones, eso probablemente sea un inconveniente).
arcname=os.path.basename(source_dir)
still significa que el archivo contiene una carpeta que contiene el contenido de source_dir
. Si desea que la raíz del archivo contenga el contenido en sí mismo y no el contenido dentro de una carpeta, utilice arcname=os.path.sep
en su lugar.
os.path.sep
, entonces el archivo contendrá el servicio "." o carpeta "/" que no suele ser un problema, pero a veces puede ser un problema si luego procesa este archivo mediante programación. Parece que la única forma realmente limpia es hacer os.walk
y agregar archivos individualmente
arcname='.'
. No es necesario usarlo os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Si desea crear un archivo comprimido tar.bz2, simplemente reemplace el nombre de la extensión del archivo con ".tar.bz2" y "w: gz" con "w: bz2".
with tarfile.open( ..
en Python, en lugar de llamar open
y close
manualmente. Este también es el caso al abrir archivos normales.
Usted llama tarfile.open conmode='w:gz'
, que significa "Abierto para escritura comprimida gzip".
Probablemente desee terminar el nombre de archivo (el name
argumento de open
) con .tar.gz
, pero eso no afecta las capacidades de compresión.
Por cierto, generalmente obtienes una mejor compresión con un modo de 'w:bz2'
, al igual tar
que normalmente se puede comprimir incluso mejor bzip2
de lo que se puede comprimir gzip
.
Las respuestas anteriores aconsejan usar el tarfile
módulo de Python para crear un .tar.gz
archivo en Python. Obviamente, es una buena solución al estilo de Python, pero tiene un serio inconveniente en la velocidad de archivo. Esta pregunta menciona que tarfile
es aproximadamente dos veces más lento que eltar
utilidad en Linux. Según mi experiencia, esta estimación es bastante correcta.
Entonces, para un archivado más rápido, puede usar el tar
comando usando el subprocess
módulo:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
Además de la respuesta de @Aleksandr Tukallo, también puede obtener la salida y el mensaje de error (si ocurre). La compresión de una carpeta usando tar
se explica bastante bien en la siguiente respuesta .
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()}")