अजगर के साथ फ़ाइलों की एक सूची का निर्माण करने का सबसे तेज़ तरीका, रिकर्सिवली सभी .MOV
या .AVI
फ़ाइलों के लिए एक निर्देशिका स्कैन करने के लिए, और उन्हें स्टोर करने के लिए सबसे तेज़ तरीका क्या है एक सूची में?अजगर में, एक निर्देशिका में जीएनयू/लिनक्स सिस्टम पर एक निश्चित विस्तार
उत्तर
वर्तमान निर्देशिका में फ़ाइलों की सूची के लिए उदाहरण। आप इसे विशिष्ट पथों के लिए विस्तारित कर सकते हैं।
import glob
movlist = glob.glob('*.mov')
आप फ़ाइल मिलान के लिए recuresive चलने और glob.glob() या fnmatch.filter() के लिए os.walk उपयोग कर सकते हैं():
चेक इस answer
मैं ओएस का उपयोग करेंगे प्रत्यय को पकड़ने के लिए निर्देशिका को स्कैन करने के लिए, os.path.splitext स्कैन करें और उन्हें स्वयं फ़िल्टर करें।
suffixes = set(['.AVI', '.MOV'])
for dirpath, dirnames, filenames in os.walk('.'):
for f in filenames:
if os.path.splitext(f)[1] in suffixes:
yield os.path.join(dirpath, f)
यह शायद सबसे अच्छा समाधान है क्योंकि इसे केस-असंवेदनशील मिलान को लागू करने के लिए आसानी से अनुकूलित किया जा सकता है। – ekhumoro
pattern = re.compile('.*\.(mov|MOV|avi|mpg)$')
def fileList(source):
matches = []
for root, dirnames, filenames in os.walk(source):
for filename in filter(lambda name:pattern.match(name),filenames):
matches.append(os.path.join(root, filename))
return matches
[fnmatch] (http://docs.python.org/library/fnmatch.html#module-fnmatch) मॉड्यूल केवल बहुत ही सरल ग्लोब पैटर्न का समर्थन करता है, इसलिए आपका फ़िल्टर काम नहीं करेगा। – ekhumoro
@ekhumoro अगर यह काम करता है, प्रतीकों ([],।,?, *,()) को ग्लोब, पायथन परीक्षण कोड की अनुमति है और देखें कि कौन सा काम – Jhonathan
आपका पैटर्न '*। [MovMOVaipg()]' के बराबर है। यह मिलान करेगा, उदाहरण के लिए, '* .i',' * .a', '* .M', आदि, लेकिन _not_' * .MOV', '* .avi', आदि इसे स्वयं के लिए आज़माएं! – ekhumoro
पायथन 2.x:
import os
def generic_tree_matching(rootdirname, filterfun):
return [
os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootdirname)
for filename in filenames
if filterfun(filename)]
def matching_ext(rootdirname, extensions):
"Case sensitive extension matching"
return generic_tree_matching(
rootdirname,
lambda fn: fn.endswith(extensions))
def matching_ext_ci(rootdirname, extensions):
"Case insensitive extension matching"
try:
extensions= extensions.lower()
except AttributeError: # assume it's a sequence of extensions
extensions= tuple(
extension.lower()
for extension in extensions)
return generic_tree_matching(
rootdirname,
lambda fn: fn.lower().endswith(extensions))
उपयोग या तो matching_ext
या matching_ext_ci
तर्क रूट फ़ोल्डर और एक विस्तार या एक्सटेंशन के एक टपल साथ:
>>> matching_ext(".", (".mov", ".avi"))
मेरा सुझाव os.walk
और सावधानीपूर्वक reading of its documentation का उपयोग।
[f for root,dirs,files in os.walk('/your/path') for f in files if is_video(f)]
कहाँ is_video
में आप अपने एक्सटेंशन की जाँच करें:
यह एक एक लाइनर दृष्टिकोण हो सकता है।
सबसे तेज़ संभवतः देशी कोड का उपयोग करने के लिए एक्सटेंशन लिखना शामिल है। लेकिन क्या आप वास्तव में चाहते हैं? –
भले ही आप ऐसा नहीं करना चाहते हैं, इस पर निर्भर करता है कि हम कितनी फाइलें और निर्देशिकाओं के बारे में बात कर रहे हैं, यह 'os.walk() 'के परिणामों को संसाधित करने से बाहरी' ढूंढ 'आदेश निष्पादित करने के लिए तेज़ हो सकता है। लेकिन अगर 'os.walk() 'समाधान पर्याप्त तेज़ है, तो यह अधिक सुरुचिपूर्ण और समझने/संपादित करने में आसान है। –