software - python tutorial




Os.walk में निर्देशिका को छोड़कर (2)

मैं एक स्क्रिप्ट लिख रहा हूं जो एक निर्देशिका पेड़ में उतरता है (os.walk () का उपयोग करके) और फिर एक निश्चित फ़ाइल एक्सटेंशन से मेल खाने वाली प्रत्येक फ़ाइल पर जाता है। हालांकि, चूंकि मेरे उपकरण का उपयोग करने वाले कुछ पेड़ों में उप-निर्देशिकाएं भी शामिल हैं जिनमें बदले में बहुत सी बेकार (इस स्क्रिप्ट के उद्देश्य के लिए) सामान शामिल हैं, मुझे लगा कि मैं उपयोगकर्ता को निर्दिष्ट करने के लिए एक विकल्प जोड़ूंगा ट्रैवर्सल से बाहर निकलने के लिए निर्देशिकाओं की एक सूची।

Os.walk () के साथ यह काफी आसान है। आखिरकार, यह तय करने के लिए मेरे पास निर्भर है कि क्या मैं वास्तव में os.walk () द्वारा उत्पन्न संबंधित फाइलों / डीआईआर पर जाना चाहता हूं या बस उन्हें छोड़ दें। समस्या यह है कि यदि मेरे पास है, उदाहरण के लिए, इस तरह एक निर्देशिका पेड़:

root--
     |
     --- dirA
     |
     --- dirB
     |
     --- uselessStuff --
                       |
                       --- moreJunk
                       |
                       --- yetMoreJunk

और मैं बेकार स्टफ और उसके सभी बच्चों को बाहर करना चाहता हूं, os.walk () अभी भी बेकार स्टफ की सभी (संभावित रूप से हजारों) उप निर्देशिकाओं में उतरेगा , जो कहने की जरूरत नहीं है, चीजों को बहुत धीमा कर देता है। एक आदर्श दुनिया में, मैं os.walk () को बेकार के किसी और बच्चे को पैदा करने से परेशान नहीं कर सकता था, लेकिन मेरे ज्ञान के लिए ऐसा करने का कोई तरीका नहीं है (है ना?)।

क्या किसी को कुछ पता है? हो सकता है कि एक थर्ड-पार्टी लाइब्रेरी है जो ऐसा कुछ प्रदान करती है?


... @ unutbu के उत्कृष्ट उत्तर का एक वैकल्पिक रूप जो थोड़ा और सीधे पढ़ता है, यह देखते हुए कि उद्देश्य ओ (एन ** 2) बनाम ओ (एन) समय की लागत पर निर्देशिकाओं को बाहर करना है।

(सूची के साथ डीआईआर सूची की एक प्रति बनाना list(dirs) सही निष्पादन के लिए आवश्यक है)

# exclude = set([...])
for root, dirs, files in os.walk(top, topdown=True):
    [dirs.remove(d) for d in list(dirs) if d in exclude]

जगह में dirs को संशोधित करने के बाद os.walk द्वारा देखी गई (बाद की) फ़ाइलों और निर्देशिकाओं को os.walk :

# exclude = set([...])
for root, dirs, files in os.walk(top, topdown=True):
    dirs[:] = [d for d in dirs if d not in exclude]

मदद से (os.walk):

जब टॉपडाउन सत्य होता है, तो कॉलर डायरनाम सूची को जगह में संशोधित कर सकता है (उदाहरण के लिए, डेल या स्लाइस असाइनमेंट के माध्यम से), और चलना केवल उपनिर्देशिकाओं में पुन: कार्य करेगा जिनके नाम डायरनाम में रहते हैं; इसका उपयोग खोज को छीनने के लिए किया जा सकता है ...





python