2015-06-17 9 views
10

के माध्यम से एक स्क्रिप्ट बनाना चाहता हूं, मैं एक निर्देशिका में फ़ोल्डर्स से सभी .tar.gz फ़ाइलों को अनजिप करने के लिए एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं। उदाहरण के लिए, मेरे पास एक फ़ाइल होगी जो इसे कॉल करे (test.tar.gz)। फिर यदि मैं मैन्युअल रूप से करता हूं, तो मैं "यहां निकालने" के लिए दबा सकता हूं, तो .tar.gz फ़ाइल एक नई फ़ाइल तैयार करेगी, और यह test.tar को कॉल करेगी। अंत में, अगर मैं "यहां निकालें" दबाए जाने की प्रक्रिया को दोहराता हूं, तो .tar फ़ाइल मुझे सभी .pdf फ़ाइलों को प्रोडक्ट करता है।मैं unzip (.tar.gz) फ़ाइल (पायथन)

मुझे आश्चर्य है कि मैं यह कैसे कर सकता हूं, और मेरे पास मेरा कोड है और ऐसा लगता है कि यह वास्तविक काम नहीं करता है।

import os 
import tarfile 
import zipfile 

def extract_file(path, to_directory='.'): 
    if path.endswith('.zip'): 
     opener, mode = zipfile.ZipFile, 'r' 
    elif path.endswith('.tar.gz') or path.endswith('.tgz'): 
     opener, mode = tarfile.open, 'r:gz' 
    elif path.endswith('.tar.bz2') or path.endswith('.tbz'): 
     opener, mode = tarfile.open, 'r:bz2' 
    else: 
     raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path 

    cwd = os.getcwd() 
    os.chdir(to_directory) 

    try: 
     file = opener(path, mode) 
     try: file.extractall() 
     finally: file.close() 
    finally: 
     os.chdir(cwd) 
+1

जब तक अजगर का उपयोग करने में एक बिंदु है, यह एक नौकरी एक खोल स्क्रिप्ट के लिए सबसे उपयुक्त तरह लगता है। – mfaerevaag

+1

extractall लक्ष्य निर्देशिका को पैरामीटर के रूप में लेता है, पीछे और आगे –

उत्तर

24

आप .tar.gz निकालने के लिए दो बार "दबाएं" क्यों चाहते हैं, जब आप आसानी से इसे एक बार कर सकते हैं? यहाँ एक ही बार में दोनों .tar और .tar.gz को निकालने के लिए एक सरल कोड है:

import tarfile 
mode = "r:gz" if (fname.endswith("tar.gz")) else "r:" 
tar = tarfile.open(fname, mode) 
tar.extractall() 
tar.close() 
+0

chdir की आवश्यकता नहीं है क्योंकि ऐसा लगता है कि मेरे पास फ़ाइल (.tar.gz) है। लेकिन अनजिपिंग प्रक्रिया, इसे (.tar.gz) से (.gz) तक निकालना होगा, फिर एक बार निकालने की जानकारी मुझे .pdf फ़ाइल इत्यादि की आवश्यकता होगी – Alex

+0

और आपका कोड काम नहीं कर रहा है: अगर (fname.endswith ("tar.gz")): नाम त्रुटि: नाम 'fname' परिभाषित नहीं किया गया है – Alex

+2

@Alex 'fname' एक स्ट्रिंग होगा जो आपका फ़ाइल नाम है। –

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