पायथन का उपयोग करके पूर्ण संकुचित टार फ़ाइल कैसे बनाएं?


107

मैं पायथन में संपीड़न के साथ .tar.gz फ़ाइल कैसे बना सकता हूं?


16
टार डेटा को संपीड़ित नहीं करता है, यह सिर्फ फाइलों को एक साथ पैक करता है। यह gzip है जो वास्तविक संपीड़न करता है।
इग्नासियो वाज़क्वेज़-अब्राम्स

जवाबों:


186

एक निर्माण करने के लिए .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


31
पाठकों के लिए एक नोट के रूप में, यदि आप बाहर निकलते हैं, arcname=os.path.basename(source_dir)तो यह आपको source_dirटार फाइल ( संपूर्ण स्थितियों में, संभवतः असुविधाजनक है) की संपूर्ण पथ संरचना प्रदान करेगा।
ब्रात्सीफोरुज़्थ्रैक्स

12
एक दूसरा नोट; arcname=os.path.basename(source_dir)अभी भी उपयोग करने का मतलब है कि संग्रह में एक फ़ोल्डर है जिसमें सामग्री शामिल है source_dir। यदि आप आर्काइव की सामग्री को स्वयं समाहित करना चाहते हैं, और फ़ोल्डर के भीतर सामग्री नहीं है, तो arcname=os.path.sepइसके बजाय उपयोग करें ।
जोनाथन एच

2
@ शलजोह दुर्भाग्य से, यह पूरी तरह से सही नहीं है, क्योंकि यदि कोई उपयोग करता है os.path.sep, तो संग्रह में सेवा शामिल होगी "।" या "/" फ़ोल्डर जो आमतौर पर कोई समस्या नहीं है, लेकिन कभी-कभी यह एक समस्या हो सकती है यदि आप बाद में इस संग्रह को प्रोग्रामेटिक रूप से संसाधित करते हैं। ऐसा लगता है कि केवल वास्तविक स्वच्छ तरीका os.walkव्यक्तिगत रूप से फ़ाइलों को करना और जोड़ना है
द गॉडफादर

सभी निर्देशिका संरचना से छुटकारा पाने के लिए, बस उपयोग करें arcname='.'। उपयोग करने की आवश्यकता नहीं है 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 संपीड़ित फ़ाइल बनाना चाहते हैं, तो फ़ाइल एक्सटेंशन नाम ".tar.bz2" और "w: gz" को "w: bz2" से बदलें।


10
आपको वास्तव with tarfile.open( ..में कॉलिंग openऔर closeमैन्युअल के बजाय पायथन में उपयोग करना चाहिए । नियमित फाइलें खोलते समय भी यही स्थिति होती है।
जोनाथन एच

31

आप के साथ tarfile.open कहते हैं mode='w:gz', जिसका अर्थ है " गज़िप संपीड़ित लेखन के लिए खोलें।"

आप संभवतः फ़ाइल नाम ( nameतर्क open) को समाप्त करना चाहते हैं .tar.gz, लेकिन यह संपीड़न क्षमताओं को प्रभावित नहीं करता है।

BTW, आप आमतौर पर के एक मोड के साथ बेहतर संपीड़न प्राप्त करते हैं 'w:bz2', जिस तरह से tarआमतौर पर के साथ bzip2तुलना कर सकते हैं के साथ भी बेहतर सेक कर सकते हैं gzip


6
बस एक त्वरित ध्यान दें कि bzip2- संपीड़ित टारबॉल के लिए फ़ाइल नाम ".tar.bz2" के साथ समाप्त होना चाहिए।
इग्नासियो वाज़केज़-अब्राम्स

8

पिछले उत्तर tarfileपायथन .tar.gzमें फ़ाइल बनाने के लिए पायथन मॉड्यूल का उपयोग करने की सलाह देते हैं । यह स्पष्ट रूप से एक अच्छा और पायथन-शैली समाधान है, लेकिन इसमें संग्रह की गति में गंभीर खामी है। इस प्रश्न का उल्लेख है कि लिनक्स में उपयोगिता tarfileकी तुलना में लगभग दो गुना धीमा है tar। मेरे अनुभव के अनुसार यह अनुमान बहुत सही है।

तो तेजी से संग्रह के लिए आप मॉड्यूल tarका उपयोग करके कमांड का उपयोग कर सकते हैं subprocess:

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

0

इस tar.gz फ़ाइल को खुले दृश्य निर्देशिका में संपीड़ित करें 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))

इसका उपयोग निर्देशिका में tar.gz फ़ाइल सेक में होता है


0

@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()}")       
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.