Ответы:
Чтобы построить .tar.gz
(иначе .tgz
) для всего дерева каталогов:
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))
Это создаст сжатый tar-архив, содержащий одну папку верхнего уровня с тем же именем и содержимым, что и source_dir
.
arcname=os.path.basename(source_dir)
укажете, он предоставит вам всю структуру путей source_dir
в tar-файле (в большинстве случаев это, вероятно, неудобно).
arcname=os.path.basename(source_dir)
still означает, что в архиве есть папка с содержимым source_dir
. Если вы хотите, чтобы корень архива содержал само содержимое, а не содержимое папки, используйте arcname=os.path.sep
вместо этого.
os.path.sep
, то в архиве будет сервис "." или папка «/», что обычно не является проблемой, но иногда это может быть проблемой, если вы позже обработаете этот архив программно. Кажется, единственный настоящий чистый способ - os.walk
arcname='.'
. Не нужно использовать os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Если вы хотите создать сжатый файл tar.bz2, просто замените имя расширения файла на «.tar.bz2» и «w: gz» на «w: bz2».
with tarfile.open( ..
Python, а не вызывать open
и close
вручную. То же самое и при открытии обычных файлов.
Вы вызываете tarfile.open с помощьюmode='w:gz'
, что означает «Открыть для записи в сжатом gzip».
Вы, вероятно, захотите закончить имя файла ( name
аргумент open
) на .tar.gz
, но это не влияет на возможности сжатия.
Кстати, вы обычно получаете лучшее сжатие с режимом 'w:bz2'
, так же как tar
обычно может сжиматься даже лучше, bzip2
чем с gzip
.
В предыдущих ответах рекомендуется использовать tarfile
модуль Python для создания .tar.gz
файла в Python. Очевидно, что это хорошее решение в стиле Python, но у него есть серьезный недостаток в скорости архивирования. В этом вопросе упоминается, что tarfile
это примерно в два раза медленнее, чемtar
утилита в Linux. По моему опыту, эта оценка вполне верна.
Итак, для более быстрого архивирования вы можете использовать tar
команду using subprocess
module:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
В дополнение к ответу @Aleksandr Tukallo вы также можете получить вывод и сообщение об ошибке (если происходит). Сжатие папки с использованием tar
довольно хорошо объясняется в следующем ответе .
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()}")