Jawaban:
Untuk membangun .tar.gz
(alias .tgz
) untuk seluruh pohon direktori:
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))
Ini akan membuat arsip tar gzip yang berisi satu folder tingkat atas dengan nama dan konten yang sama seperti source_dir
.
arcname=os.path.basename(source_dir)
maka itu akan memberi Anda seluruh struktur jalur source_dir
dalam file tar (dalam banyak situasi, itu mungkin tidak nyaman).
arcname=os.path.basename(source_dir)
masih berarti arsip berisi folder yang berisi konten source_dir
. Jika Anda ingin root arsip berisi konten itu sendiri, dan bukan konten di dalam folder, gunakan arcname=os.path.sep
saja.
os.path.sep
, maka arsip akan berisi layanan "." atau folder "/" yang biasanya tidak menjadi masalah, tetapi terkadang dapat menjadi masalah jika nanti Anda memproses arsip ini secara terprogram. Tampaknya satu-satunya cara yang benar-benar bersih adalah dengan melakukan os.walk
dan menambahkan file satu per satu
arcname='.'
. Tidak perlu digunakan os.walk
.
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
Jika Anda ingin membuat file terkompresi tar.bz2, cukup ganti nama ekstensi file dengan ".tar.bz2" dan "w: gz" dengan "w: bz2".
with tarfile.open( ..
Python, daripada menelepon open
dan close
secara manual. Ini juga terjadi saat membuka file biasa.
Anda memanggil tarfile.open dengan mode='w:gz'
, yang berarti "Terbuka untuk tulisan terkompresi gzip."
Anda mungkin ingin mengakhiri nama file ( name
argumen ke open
) dengan .tar.gz
, tetapi itu tidak mempengaruhi kemampuan kompresi.
BTW, Anda biasanya mendapatkan kompresi yang lebih baik dengan mode 'w:bz2'
, seperti tar
biasanya dapat mengompres dengan lebih baik bzip2
daripada yang dapat dikompres gzip
.
Jawaban sebelumnya menyarankan penggunaan tarfile
modul Python untuk membuat .tar.gz
file dengan Python. Itu jelas merupakan solusi yang bagus dan bergaya Python, tetapi memiliki kelemahan serius dalam kecepatan pengarsipan. Pertanyaan ini menyebutkan bahwa tarfile
kira-kira dua kali lebih lambat daripada tar
utilitas di Linux. Menurut pengalaman saya, perkiraan ini cukup tepat.
Jadi untuk pengarsipan lebih cepat Anda dapat menggunakan tar
perintah menggunakan subprocess
modul:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
Dalam file tar.gz ini kompres dalam direktori tampilan terbuka Dalam menyelesaikannya gunakan 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))
penggunaannya dalam kompres file tar.gz dalam direktori
Selain jawaban @Aleksandr Tukallo, Anda juga bisa mendapatkan output dan pesan kesalahan (jika terjadi). Mengompresi folder menggunakan tar
dijelaskan dengan cukup baik pada jawaban berikut .
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()}")