जवाबों:
एक निर्माण करने के लिए .tar.gz(उर्फ .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।
arcname=os.path.basename(source_dir)तो यह आपको source_dirटार फाइल ( संपूर्ण स्थितियों में, संभवतः असुविधाजनक है) की संपूर्ण पथ संरचना प्रदान करेगा।
arcname=os.path.basename(source_dir)अभी भी उपयोग करने का मतलब है कि संग्रह में एक फ़ोल्डर है जिसमें सामग्री शामिल है source_dir। यदि आप आर्काइव की सामग्री को स्वयं समाहित करना चाहते हैं, और फ़ोल्डर के भीतर सामग्री नहीं है, तो arcname=os.path.sepइसके बजाय उपयोग करें ।
os.path.sep, तो संग्रह में सेवा शामिल होगी "।" या "/" फ़ोल्डर जो आमतौर पर कोई समस्या नहीं है, लेकिन कभी-कभी यह एक समस्या हो सकती है यदि आप बाद में इस संग्रह को प्रोग्रामेटिक रूप से संसाधित करते हैं। ऐसा लगता है कि केवल वास्तविक स्वच्छ तरीका os.walkव्यक्तिगत रूप से फ़ाइलों को करना और जोड़ना है
arcname='.'। उपयोग करने की आवश्यकता नहीं है 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 संपीड़ित फ़ाइल बनाना चाहते हैं, तो फ़ाइल एक्सटेंशन नाम ".tar.bz2" और "w: gz" को "w: bz2" से बदलें।
with tarfile.open( ..में कॉलिंग openऔर closeमैन्युअल के बजाय पायथन में उपयोग करना चाहिए । नियमित फाइलें खोलते समय भी यही स्थिति होती है।
आप के साथ tarfile.open कहते हैं mode='w:gz', जिसका अर्थ है " गज़िप संपीड़ित लेखन के लिए खोलें।"
आप संभवतः फ़ाइल नाम ( nameतर्क open) को समाप्त करना चाहते हैं .tar.gz, लेकिन यह संपीड़न क्षमताओं को प्रभावित नहीं करता है।
BTW, आप आमतौर पर के एक मोड के साथ बेहतर संपीड़न प्राप्त करते हैं 'w:bz2', जिस तरह से tarआमतौर पर के साथ bzip2तुलना कर सकते हैं के साथ भी बेहतर सेक कर सकते हैं gzip।
पिछले उत्तर tarfileपायथन .tar.gzमें फ़ाइल बनाने के लिए पायथन मॉड्यूल का उपयोग करने की सलाह देते हैं । यह स्पष्ट रूप से एक अच्छा और पायथन-शैली समाधान है, लेकिन इसमें संग्रह की गति में गंभीर खामी है। इस प्रश्न का उल्लेख है कि लिनक्स में उपयोगिता tarfileकी तुलना में लगभग दो गुना धीमा है tar। मेरे अनुभव के अनुसार यह अनुमान बहुत सही है।
तो तेजी से संग्रह के लिए आप मॉड्यूल tarका उपयोग करके कमांड का उपयोग कर सकते हैं subprocess:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
@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()}")