2013-04-18 6 views
28

मेरे पास दो अलग-अलग निर्देशिकाओं में दो फाइलें हैं, एक '/home/test/first/first.pdf' है, दूसरा '/home/text/second/second.pdf' है। मैं कोड निम्न का उपयोग कर उन्हें संपीड़ित करने के लिए:पायथन/ज़िप: फ़ाइलों के लिए पूर्ण पथ प्रदान किए जाने पर ज़िप संग्रह में पूर्ण पथ को कैसे समाप्त किया जाए?

import zipfile, StringIO 
buffer = StringIO.StringIO() 
first_path = '/home/test/first/first.pdf' 
second_path = '/home/text/second/second.pdf' 
zip = zipfile.ZipFile(buffer, 'w') 
zip.write(first_path) 
zip.write(second_path) 
zip.close() 

के बाद मुझे लगता है कि मैं बनाया ज़िप फ़ाइल खोलने, मैं इसे में एक home फ़ोल्डर है, तो उसमें दो उप फ़ोल्डरों, first और second, तो पीडीएफ हैं फ़ाइलें। मुझे नहीं पता कि ज़िप संग्रह में पूर्ण पथ को ज़िपित करने के बजाय केवल दो पीडीएफ फाइलों को कैसे शामिल किया जाए। मुझे उम्मीद है कि मैं अपना प्रश्न स्पष्ट कर दूंगा, कृपया मदद करें। धन्यवाद।

उत्तर

72

zipfile लिखने() विधि एक अतिरिक्त तर्क (arcname) जो संग्रह नाम में संग्रहीत किया जा रहा है का समर्थन करता है ज़िप फ़ाइल है, तो आप केवल के साथ अपने कोड को बदलने की जरूरत हैं: जब आप कुछ खाली समय zipfile के लिए दस्तावेज़ पढ़ने सहायक होगा है

from os.path import basename 
... 
zip.write(first_path, basename(first_path)) 
zip.write(second_path, basename(second_path)) 
zip.close() 

4

मैं वहाँ एक और अधिक सुरुचिपूर्ण समाधान हो सकता है संदेह है, लेकिन यह एक काम करना चाहिए:

def add_zip_flat(zip, filename): 
    dir, base_filename = os.path.split(filename) 
    os.chdir(dir) 
    zip.write(base_filename) 

zip = zipfile.ZipFile(buffer, 'w') 
add_zip_flat(zip, first_path) 
add_zip_flat(zip, second_path) 
zip.close() 
5

मैं एक निर्देशिका ज़िप करने इस फ़ंक्शन का उपयोग बिना निरपेक्ष पथ शामिल

import zipfile 
import os 
def zipDir(dirPath, zipPath): 
    zipf = zipfile.ZipFile(zipPath , mode='w') 
    lenDirPath = len(dirPath) 
    for root, _ , files in os.walk(dirPath): 
     for file in files: 
      filePath = os.path.join(root, file) 
      zipf.write(filePath , filePath[lenDirPath :]) 
    zipf.close() 
#end zipDir 
संबंधित मुद्दे