Відповіді:
Щоб скласти .tar.gz
(aka .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))
Це створить gzipped архів дьогтю, що містить одну папку верхнього рівня з тим самим назвою та вмістом, як source_dir
.
arcname=os.path.basename(source_dir)
то це дасть вам всю структуру шляху source_dir
файлу tar (у більшості ситуацій це, мабуть, незручно).
arcname=os.path.basename(source_dir)
все ще означає, що архів містить папку, яка містить вміст 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
команду за допомогою subprocess
модуля:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
У цьому файлі tar.gz стискається у каталозі відкритого перегляду. Для вирішення використовуйте os.path.basename (file_directory)
with tarfile.open("save.tar.gz","w:gz"):
for file in ["a.txt","b.log","c.png"]:
tar.add(os.path.basename(file))
його використання у файлі tar.gz, стиснення файлів у каталозі
Окрім відповіді @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()}")