यहाँ पैट के उत्तर की एक-पंक्ति सूची-बोधगम्यता संस्करण है (जिसमें यह भी शामिल है कि आप एक विशिष्ट श्रेणी निर्देशिका में ग्लोब करना चाहते थे):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
आप एक्सटेंशन ( for ext in exts
) पर लूप करते हैं , और फिर प्रत्येक एक्सटेंशन के लिए आप ग्लोब पैटर्न से मेल खाती प्रत्येक फ़ाइल लेते हैं (for f in glob.glob(os.path.join(project_dir, ext)
) से ।
यह समाधान छोटा है , और बिना किसी अनावश्यक-लूप के, नेस्टेड सूची-समझ, या कोड को अव्यवस्थित करने के लिए कार्य करता है। बस शुद्ध, अभिव्यंजक, पायथोनिक ज़ेन ।
यह समाधान आपको कस्टम सूची की अनुमति देता है exts
जिसे आपके कोड को अपडेट किए बिना बदला जा सकता है। (यह हमेशा एक अच्छा अभ्यास है!)
लिस्ट-कॉम्प्रिहेंशन का उपयोग लॉरेंट के समाधान में किया जाता है (जिसे मैंने वोट दिया है)। लेकिन मैं यह तर्क दूंगा कि आमतौर पर किसी एक लाइन को एक अलग फ़ंक्शन में डालना अनावश्यक है, यही वजह है कि मैं इसे वैकल्पिक समाधान के रूप में प्रदान कर रहा हूं।
बक्शीश:
यदि आपको न केवल एक निर्देशिका, बल्कि सभी उप-निर्देशिकाओं को खोजने की आवश्यकता है, तो आप recursive=True
बहु-निर्देशिका ग्लोब प्रतीक को पास और उपयोग कर सकते हैं : **
1
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
यह आह्वान करेगा glob.glob('<project_dir>/**/*.txt', recursive=True)
प्रत्येक विस्तार के लिए ।
1 तकनीकी रूप से, **
ग्लोब प्रतीक केवल एक या एक से अधिक अक्षरों से मेल खाता है जिसमें फॉरवर्ड-स्लैश /
(एकवचन *
ग्लोब प्रतीक के विपरीत ) शामिल हैं। व्यवहार में, आपको बस यह याद रखने की आवश्यकता है कि जब तक आप **
फॉरवर्ड स्लैश (पथ विभाजक) से घिरे रहते हैं , यह शून्य या अधिक निर्देशिकाओं से मेल खाता है।