tar

2011-11-04 7 views
6

से केवल एक ही निर्देशिका निकालें मैं पाइथन में एक प्रोजेक्ट पर काम कर रहा हूं जिसमें मुझे टैर आर्काइव का केवल एक उपफोल्डर निकालने की आवश्यकता है, सभी फाइलें नहीं। मैंtar

tar = tarfile.open(tarfile) 
tar.extract("dirname", targetdir) 

का उपयोग करने की कोशिश की लेकिन यह काम नहीं करता है, यह देखते हुए उप-निर्देशिका भी कोई अपवाद नहीं फेंक दिया जाता है निकालने नहीं है। मैं अजगर में एक नौसिखिया हूँ। यदि उपरोक्त फ़ंक्शन निर्देशिकाओं के लिए काम नहीं करता है तो यह आदेश और tar.extractfile() के बीच क्या अंतर है?

+0

extractfile() डिस्क पर एक फ़ाइल में लिखने नहीं है, यह केवल आपके देता है एक पायथन वस्तु। निकालें() डिस्क पर लिखता है। –

उत्तर

11

tarfile module documentation से दूसरे उदाहरण पर भवन, आप निहित सबफ़ोल्डर और उसकी सारी सामग्री को कुछ इस तरह से निकाल सकते:

with tarfile.open("sample.tar") as tar: 
    subdir_and_files = [ 
     tarinfo for tarinfo in tar.getmembers() 
     if tarinfo.name.startswith("subfolder/") 
    ] 
    tar.extractall(members=subdir_and_files) 

यह सबफ़ोल्डर और उसकी सामग्री की एक सूची बनाता है, और फिर केवल निकालने के लिए अनुशंसित extractall() विधि का उपयोग करता है। बेशक, उस उप-फ़ोल्डर के वास्तविक पथ (टैर फ़ाइल की जड़ से संबंधित) के साथ "subfolder/" को प्रतिस्थापित करें जिसे आप निकालना चाहते हैं।

4

दूसरा उत्तर उपफोल्डर पथ को बनाए रखेगा, जिसका अर्थ है कि subfolder/a/b./subfolder/a/b पर निकाला जाएगा। जड़ को एक सबफ़ोल्डर को निकालने के लिए है, तो subfolder/a/b./a/b को निकाला जा सकता है, आप कुछ इस तरह साथ रास्ते को फिर से लिखने कर सकते हैं:

def members(tf): 
    l = len("subfolder/") 
    for member in tf.getmembers(): 
     if member.path.startswith("subfolder/"): 
      member.path = member.path[l:] 
      yield member 

with tarfile.open("sample.tar") as tar: 
    tar.extractall(members=members(tar)) 
+0

महान काम करता है। आप 'member.path = os.path.join ('new_dirname', member.path [l:]) करके इस शैली के साथ शीर्ष-स्तरीय फ़ोल्डर का नाम भी बदल सकते हैं। – Blake

संबंधित मुद्दे