2016-03-29 3 views
7

में मैं जो इस तरह उस में तीन ज़िप फ़ाइलें हैं एक ज़िप फ़ाइल है:रिकर्सिवली ज़िप फ़ाइल निकालने के लिए कैसे अजगर

zipfile.zip\ 
    dirA.zip\ 
     a 
    dirB.zip\ 
     b 
    dirC.zip\ 
     c 

मैं सभी आंतरिक ज़िप फ़ाइलों कि निर्देशिका में ज़िप फ़ाइल के अंदर हैं निकालना चाहते हैं इन नामों के साथ (डीआईआरए, डीआईआरबी, डीआईआरसी)।

import os, re 
from zipfile import ZipFile 

os.makedirs(directory) # where directory is "\output" 
with ZipFile(self.archive_name, "r") as archive: 
    for id, files in data.items(): 
     if files: 
      print("Creating", id) 
      dirpath = os.path.join(directory, id) 

      os.mkdir(dirpath) 

      for file in files: 
       match = pattern.match(filename) 
       new = match.group(2) 
       new_filename = os.path.join(dirpath, new) 

       content = archive.open(file).read() 
      with open(new_filename, "wb") as outfile: 
       outfile.write(content) 

लेकिन यह केवल ज़िप फ़ाइल निकालता है और मैं अंत:

output\ 
    dirA\ 
     a 
    dirB\ 
     b 
    dirC\ 
     c 

मैं निम्नलिखित की कोशिश की है:
असल में, मैं निम्नलिखित स्कीमा के साथ खत्म करना चाहते हैं

output\ 
    dirA\ 
     dirA.zip 
    dirB\ 
     dirB.zip 
    dirC\ 
     dirC.zip 

कोई भी कोड-सेगमेंट सहित सुझावों की बहुत सराहना की जाएगी क्योंकि मैंने कई अलग-अलग टी की कोशिश की है बिना सफलता के दस्तावेज़ों को पढ़ा और पढ़ें।

+0

कृपया अपने प्रश्न को संशोधित करें और एक [_ न्यूनतम, पूर्ण, और सत्यापन योग्य उदाहरण_] (https://stackoverflow.com/help/mcve) प्रदान करें जिसमें 'data.items()' में शामिल है। – martineau

+0

@martineau आपकी टिप्पणी के लिए धन्यवाद। जैसा कि ऊपर वर्णित है, डेटा \ zipfile.zip> dirA.zip> एक \ zipfile.zip> dirB.zip> ख \ zipfile.zip> dirC.zip> ग थोड़ा मैं सवाल करने की कोशिश की रखती है जो भी 'डेटा' धारण करता है, उससे अधिक सामान्य और निर्भर नहीं है, इस तथ्य को छोड़कर कि ज़िप के अंदर ज़िप हैं। – Yannis

उत्तर

4

ज़िप फ़ाइल निकालने पर, आप आंतरिक ज़िप फ़ाइलों को डिस्क पर उनके बजाय स्मृति में लिखना चाहेंगे। ऐसा करने के लिए, मैंने BytesIO का उपयोग किया है। इस कोड को बाहर

की जांच:

import os 
import io 
import zipfile 

def extract(filename): 
    z = zipfile.ZipFile(filename) 
    for f in z.namelist(): 
     # get directory name from file 
     dirname = os.path.splitext(f)[0] 
     # create new directory 
     os.mkdir(dirname) 
     # read inner zip file into bytes buffer 
     content = io.BytesIO(z.read(f)) 
     zip_file = zipfile.ZipFile(content) 
     for i in zip_file.namelist(): 
      zip_file.extract(i, dirname) 

आप zipfile.zip के रूप में साथ extract("zipfile.zip") चलाते हैं:

zipfile.zip/ 
    dirA.zip/ 
     a 
    dirB.zip/ 
     b 
    dirC.zip/ 
     c 

आउटपुट होना चाहिए:

dirA/ 
    a 
dirB/ 
    b 
dirC/ 
    c 
+0

@Yannis अद्यतन उत्तर की जांच करें। – Forge

+0

बिल्कुल वही जो मैं खोज रहा था, यह मेरे प्रश्न पर वर्णित निष्कर्षण करता है। धन्यवाद! – Yannis

+0

@ फोर्ज त्रुटि: sub_zip परिभाषित नहीं है –

0

एक समारोह है कि एक नेस्टेड ज़िप अर्क के लिए फ़ाइल (घोंसले का कोई स्तर) और मूल ज़िप फ़ाइलों को साफ़ करता है:

import zipfile, re, os 

def extract_nested_zip(zippedFile, toFolder): 
    """ Extract a zip file including any nested zip files 
     Delete the zip file(s) after extraction 
    """ 
    with zipfile.ZipFile(zippedFile, 'r') as zfile: 
     zfile.extractall(path=toFolder) 
    os.remove(zippedFile) 
    for root, dirs, files in os.walk(toFolder): 
     for filename in files: 
      if re.search(r'\.zip$', filename): 
       fileSpec = os.path.join(root, filename) 
       extract_nested_zip(fileSpec, root) 
संबंधित मुद्दे