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.