2012-07-23 14 views
5

के साथ मौजूद है या नहीं, शुरुआत में मैं os.path.isdir का उपयोग करने के बारे में सोच रहा था लेकिन मुझे नहीं लगता कि यह ज़िप फ़ाइलों के लिए काम करता है। क्या ज़िप फ़ाइल में देखने का कोई तरीका है और यह सत्यापित करें कि यह निर्देशिका मौजूद है? मैं जितना संभव हो unzip -l "[email protected]" का उपयोग करना बंद करना चाहता हूं, लेकिन अगर यह एकमात्र समाधान है तो मुझे लगता है कि मेरे पास कोई विकल्प नहीं है।जांचें कि कोई निर्देशिका ज़िप फ़ाइल में पाइथन

उत्तर

6

बस इसके अंत में फ़ाइल नाम "/" के साथ जांचें।

import zipfile 

def isdir(z, name): 
    return any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

f = zipfile.ZipFile("sample.zip", "r") 
print isdir(f, "a") 
print isdir(f, "a/b") 
print isdir(f, "a/X") 

आप क्योंकि यह संभव है कि संग्रह कोई निर्देशिका स्पष्ट होता है इस लाइन

any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

का उपयोग करें; निर्देशिका नाम के साथ बस एक पथ।

निष्पादन परिणाम:

$ mkdir -p a/b/c/d 
$ touch a/X 
$ zip -r sample.zip a 
adding: a/ (stored 0%) 
adding: a/X (stored 0%) 
adding: a/b/ (stored 0%) 
adding: a/b/c/ (stored 0%) 
adding: a/b/c/d/ (stored 0%) 

$ python z.py 
True 
True 
False 
+0

धन्यवाद! अच्छा यह आपके द्वारा प्रदान किए गए नमूने के साथ काम करता है। लेकिन मैं इसे docx फ़ाइलों के लिए करने की कोशिश कर रहा हूं। अनिवार्य रूप से मैं जांच रहा हूं कि ज़िप फ़ाइल में निर्देशिका "शब्द" है, लेकिन यह मुझे झूठी प्रतिक्रिया दे रहा है :( –

+0

बस अपने 'docx' में फ़ाइलों की सूची मुद्रित करने का प्रयास करें और देखें कि इसके साथ क्या अजीब बात है:' प्रिंट zipfile.ZipFile ("sample.docx", "r")। Namelist() ' –

+0

मुझे लगता है कि आपके पास 'शब्द' से पहले कुछ उपसर्ग है। कृपया यह जाँचें। –

6

आप ZipFile.namelist() के साथ निर्देशिकाओं की जांच कर सकते हैं।

import os, zipfile 
dir = "some/directory/" 

z = zipfile.ZipFile("myfile.zip") 
if dir in z.namelist(): 
    print "Found %s!" % dir 
+0

यह फ़ाइलों के लिए काम करता है लेकिन निर्देशिका नहीं :(कम से कम मेरे लिए नहीं। –

+0

अपनी निर्देशिका को सही ढंग से स्वरूपित करने के लिए अपनी .zip फ़ाइल के 'namelist() 'को प्रिंट करने का प्रयास करें। – enderskill

+0

हाँ, मैंने सुनिश्चित किया है कि निर्देशिका है वहाँ। मैं इसे docx फ़ाइलों के लिए करने की कोशिश कर रहा हूं, जो कि ज़िप फ़ाइलों को वैसे भी हैं, जिससे सही बात नहीं होनी चाहिए? –

0

आप इस में निर्मित पुस्तकालय zipfile के प्रयोग से कर सकते हैं।

import zipfile 
z = zipfile.ZipFile("file.zip") 

if "DirName/" in [member.filename for member in z.infolist()]: 
    print("Directory exists in archive") 

पायथन 32 के साथ परीक्षण और कार्यात्मक।

+0

किसी भी कारण से यह docx फ़ाइलों के लिए काम नहीं करता है। :( –

+0

आप ज़िप के बजाए एक डॉक्क्स फ़ाइल का उपयोग करने की कोशिश कर रहे हैं? एक्सटेंशन को .zip पर पुनर्नामित करें और इसे फिर से प्रयास करें, इसे काम करना चाहिए। – Lanaru

+0

यह ठीक अनजिपिंग काम करता है, और मैं इसे सभी फ़ाइलों को प्रिंट करने के लिए प्राप्त कर सकता हूं। लेकिन निर्देशिका "शब्द" namelist() में नहीं है, बल्कि अलग-अलग फाइलें, जैसे शब्द/webSettings.xml, इसलिए यह एक मैच नहीं मिल रहा है। –

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