Python kullanarak tam sıkıştırılmış tar dosyası nasıl oluşturulur?


Yanıtlar:


186

Tüm bir dizin ağacı için bir .tar.gz(aka .tgz) oluşturmak için:

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))

Bu, ile aynı ada ve içeriğe sahip tek bir üst düzey klasör içeren gzip'li bir tar arşivi oluşturacaktır source_dir.


31
Okuyuculara bir not olarak, eğer dışarıda bırakırsanız , tar dosyasındaki arcname=os.path.basename(source_dir)tüm yol yapısını size verecektir source_dir(çoğu durumda, bu muhtemelen uygunsuzdur).
— Brōtsyorfuzthrāx

12
İkinci bir not; arcname=os.path.basename(source_dir)hala kullanmak arşivin içeriğini içeren bir klasör içerdiği anlamına gelir source_dir. Arşivin kökünün içeriğin kendisini içermesini ve bir klasör içindeki içeriği istememesini istiyorsanız, arcname=os.path.sepbunun yerine kullanın.
— Jonathan H

2
@Sheljohn maalesef bu tam olarak doğru değil, çünkü kullanılıyorsa os.path.separşiv hizmet "" içerecektir. veya "/" klasörü genellikle bir sorun değildir, ancak bazen bu arşivi daha sonra programla işlerseniz sorun olabilir. Görünüşe göre tek gerçek temiz yol, os.walkdosyaları ayrı ayrı yapmak ve eklemek
— The Godfather

Tüm dizin yapısından kurtulmak için kullanın arcname='.'. Kullanmaya gerek yok 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 sıkıştırılmış bir dosya oluşturmak istiyorsanız, dosya uzantısı adını ".tar.bz2" ve "w: gz" yi "w: bz2" ile değiştirin.


10
Gerçekten kullanmalıdır with tarfile.open( ..yerine çağırmak, Python openve closemanuel. Bu aynı zamanda normal dosyaları açarken de geçerlidir.
— Jonathan H

31

Sen buna tarfile.open ile mode='w:gz'yani "gzip sıkıştırılmış yazma Aç."

Muhtemelen dosya adını ( nameargümanını open) ile bitirmek isteyeceksiniz .tar.gz, ancak bu sıkıştırma yeteneklerini etkilemez.

BTW, genellikle bir mod ile daha iyi sıkıştırma elde edersiniz 'w:bz2', tıpkı targenellikle sıkıştırabildiğinden daha iyi bzip2sıkıştırabildiği gibi gzip.


6
Bzip2 ile sıkıştırılmış tarball'ların dosya adının ".tar.bz2" ile bitmesi gerektiğine dikkat edin.
— Ignacio Vazquez-Abrams

8

Önceki cevaplar, tarfilePython'da bir .tar.gzdosya oluşturmak için Python modülünün kullanılmasını önerir . Bu kesinlikle iyi ve Python tarzı bir çözüm, ancak arşivleme hızında ciddi dezavantajı var. Bu soru , Linux'taki yardımcı programdan tarfileyaklaşık iki kat daha yavaş olduğundan bahsediyor tar. Tecrübelerime göre bu tahmin oldukça doğrudur.

Bu nedenle, daha hızlı arşivleme için modülü tarkullanarak komutu kullanabilirsiniz subprocess:

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

0

Bu tar.gz dosyasında açık görünüm dizininde sıkıştırın Çözümde os.path.basename (dosya_dizini) kullanın

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 dosyasında kullanımı dizinde sıkıştırılır


0

@Aleksandr Tukallo'nun cevabına ek olarak, çıktıyı ve hata mesajını da alabilirsiniz (eğer oluşursa). Bir klasörün sıkıştırılması aşağıdaki cevaptatar oldukça iyi açıklanmıştır .

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()}")       
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.