2012-05-13 7 views
9

में एक ही ज़िप फ़ाइल में एकाधिक ज़िप फ़ाइलों को मर्ज करें मेरे पास एकाधिक ज़िप फ़ाइलें हैं जिनमें समान संरचना है - उनमें रूट स्तर पर एक्सएमएल फाइलें हैं। प्रत्येक ज़िप फ़ाइल में सभी फ़ाइलें अनूठी होती हैं (ज़िप फ़ाइलों में कोई डुप्लिकेट नहीं)। मुझे सभी ज़िप फ़ाइलों से सभी एक्सएमएल फ़ाइलों को एक ज़िप फ़ाइल में जोड़ना होगा (मूल ज़िप फ़ाइलों के समान संरचना के साथ)। ऐसा करने के लिए सबसे अच्छा तरीका कैसे है? धन्यवाद।पाइथन

+3

उन सभी को अनपैक करें और एक नया बनाएं? – sarnold

+3

यह सबसे स्पष्ट दृष्टिकोण होगा। आप अंतिम ज़िपफाइल के रूप में भी एक चुन सकते हैं, दूसरों से फ़ाइलों को निकाल सकते हैं और उन्हें अंतिम में जोड़ सकते हैं, लेकिन यह सुनिश्चित नहीं है कि यह कोई तेज़ होगा। – jgritty

+0

धन्यवाद @ कर्नाल्ड। मैं भी इस दृष्टिकोण के बारे में सोच रहा था, लेकिन यह सुनिश्चित नहीं था कि ऐसा करने का एक और शानदार तरीका है या नहीं। –

उत्तर

11

यह कम से कम संस्करण मैं के साथ आ सकता है: विकल्प के परीक्षण के बिना

>>> import zipfile as z 
>>> z1 = z.ZipFile('z1.zip', 'a') 
>>> z2 = z.ZipFile('z2.zip', 'r') 
>>> z1.namelist() 
['a.xml', 'b.xml'] 
>>> z2.namelist() 
['c.xml', 'd.xml'] 
>>> [z1.writestr(t[0], t[1].read()) for t in ((n, z2.open(n)) for n in z2.namelist())] 
[None, None] 
>>> z1.namelist() 
['a.xml', 'b.xml', 'c.xml', 'd.xml'] 
>>> z1.close() 

, मुझे यह (और शायद सबसे स्पष्ट!) सबसे अच्छा है समाधान क्योंकि - दोनों ज़िप फ़ाइलों संभालने शामिल डेटा की एक ही मात्रा में, इस विधि के लिए केवल आधा (1 फ़ाइल) के डिकंप्रेशन और पुनः संपीड़न की आवश्यकता होती है।

पीएस: कंसोल में एक पंक्ति पर निर्देश रखने के लिए सूची समझ है (जो डिबगिंग गति को गति देता है)। अच्छा पायथनिक कोड उचित for लूप की आवश्यकता होगी, जिसके परिणामस्वरूप सूची कोई उद्देश्य नहीं प्रदान करती है ...

एचटीएच!

+0

धन्यवाद, हालांकि मेरे पास ज़िप फ़ाइलों की एक अलग संख्या होगी, इसलिए मुझे एक और सामान्य दृष्टिकोण की आवश्यकता है। –

+1

@ डेवक्रंबैकर: जब तक कि मैंने आपको गलत समझा नहीं है, आपको एक से अधिक फाइलों को विलय करने के लिए इस दृष्टिकोण का उपयोग करने के लिए करना है, एक लूप जोड़ना है: 'zfile in (z2, z3, z4, ...)' के लिए ... । या क्या मैं कुछ न कुछ भूल रहा हूं? – mac

+0

हां, @ एमएसी, आप सही हैं। धन्यवाद। –

6

यहां मैं क्या आया, धन्यवाद @ एमएसी। ध्यान दें कि जिस तरह से इसे वर्तमान में लागू किया गया है, पहली ज़िप फ़ाइल को अन्य ज़िप फ़ाइलों से सभी फ़ाइलों को शामिल करने के लिए संशोधित किया गया है।

import zipfile as z 

zips = ['z1.zip', 'z2.zip', 'z3.zip'] 

""" 
Open the first zip file as append and then read all 
subsequent zip files and append to the first one 
""" 
with z.ZipFile(zips[0], 'a') as z1: 
    for fname in zips[1:]: 
     zf = z.ZipFile(fname, 'r') 
     for n in zf.namelist(): 
      z1.writestr(n, zf.open(n).read()) 
+5

'zipfile.ZipFile()' एक संदर्भ प्रबंधक भी है, इसलिए आप z1ZipFile (zips [0], 'a') के साथ अपने 'z1.close()' को 'z1:' और इंडेंट के रूप में बदल सकते हैं बाद का कोड। पढ़ने की वस्तुओं के साथ ही वही। – glglgl

+2

धन्यवाद @glglgl। मैंने इस दृष्टिकोण को दर्शाने के लिए अपना जवाब अपडेट कर दिया है। –