Як створити повний стислий файл смоли за допомогою Python?


Відповіді:


186

Щоб скласти .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.


31
Як зауваження читачам, якщо ви не залишите його, arcname=os.path.basename(source_dir)то це дасть вам всю структуру шляху source_dirфайлу tar (у більшості ситуацій це, мабуть, незручно).
Brōtsyorfuzthrāx

12
Друга примітка; Використання arcname=os.path.basename(source_dir)все ще означає, що архів містить папку, яка містить вміст source_dir. Якщо ви хочете, щоб корінь архіву містив сам вміст, а не вміст у папці, використовуйте arcname=os.path.sepзамість цього.
Джонатан Н

2
@Sheljohn, на жаль, це не зовсім коректно, тому що якщо хтось використовує os.path.sep, то архів буде містити сервіс "." або "/" папку, яка зазвичай не є проблемою, але іноді це може бути проблемою, якщо ви згодом обробляєте цей архів програмно. Здається, єдиний справжній чистий спосіб - це робити os.walkта додавати файли окремо
The Godfather

Щоб позбутися всієї структури каталогів, просто використовуйте arcname='.'. Не потрібно використовувати os.walk.
edouardtheron

85
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".


10
Вам дійсно слід використовувати with tarfile.open( ..в Python, а не дзвонити openта closeвручну. Це також відбувається під час відкриття звичайних файлів.
Джонатан Н

31

Ви зателефонуєте на tarfile.open з mode='w:gz', що означає "Відкрити для стискання тексту gzip."

Ви, ймовірно, захочете закінчити ім'я файлу ( nameаргумент open) .tar.gz, але це не впливає на здатність до стиснення.

До речі, ти зазвичай отримуєш кращу компресію в режимі 'w:bz2', як і tarзазвичай, може стискати навіть краще, bzip2ніж може стискати gzip.


6
Просто коротке зауваження, що ім'я файлу для компресованих bzip2 тарболів має закінчуватися символом ".tar.bz2".
Ігнасіо Васкес-Абрамс

8

Попередні відповіді радять використовувати tarfileмодуль Python для створення .tar.gzфайлу в Python. Це, очевидно, гарне рішення в стилі Python, але воно має серйозні недоліки в швидкості архівації. У цьому питанні згадується tarfileприблизно в два рази повільніше, ніж tarутиліта в Linux. На мій досвід, ця оцінка є досить правильною.

Отже, для швидшого архівування ви можете використовувати tarкоманду за допомогою subprocessмодуля:

subprocess.call(['tar', '-czf', output_filename, file_to_archive])

0

У цьому файлі 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, стиснення файлів у каталозі


0

Окрім відповіді @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()}")       
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.