Yanıtlar:
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
.
arcname=os.path.basename(source_dir)
tüm yol yapısını size verecektir source_dir
(çoğu durumda, bu muhtemelen uygunsuzdur).
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.sep
bunun yerine kullanın.
os.path.sep
arş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.walk
dosyaları ayrı ayrı yapmak ve eklemek
arcname='.'
. Kullanmaya gerek yok 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 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.
with tarfile.open( ..
yerine çağırmak, Python open
ve close
manuel. Bu aynı zamanda normal dosyaları açarken de geçerlidir.
Sen buna tarfile.open ile mode='w:gz'
yani "gzip sıkıştırılmış yazma Aç."
Muhtemelen dosya adını ( name
argü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ı tar
genellikle sıkıştırabildiğinden daha iyi bzip2
sıkıştırabildiği gibi gzip
.
Önceki cevaplar, tarfile
Python'da bir .tar.gz
dosya 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 tarfile
yaklaşı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ü tar
kullanarak komutu kullanabilirsiniz subprocess
:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
@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()}")