2011-12-24 9 views
5

अजगर के साथ फ़ाइलों की एक सूची का निर्माण करने का सबसे तेज़ तरीका, रिकर्सिवली सभी .MOV या .AVI फ़ाइलों के लिए एक निर्देशिका स्कैन करने के लिए, और उन्हें स्टोर करने के लिए सबसे तेज़ तरीका क्या है एक सूची में?अजगर में, एक निर्देशिका में जीएनयू/लिनक्स सिस्टम पर एक निश्चित विस्तार

+1

सबसे तेज़ संभवतः देशी कोड का उपयोग करने के लिए एक्सटेंशन लिखना शामिल है। लेकिन क्या आप वास्तव में चाहते हैं? –

+0

भले ही आप ऐसा नहीं करना चाहते हैं, इस पर निर्भर करता है कि हम कितनी फाइलें और निर्देशिकाओं के बारे में बात कर रहे हैं, यह 'os.walk() 'के परिणामों को संसाधित करने से बाहरी' ढूंढ 'आदेश निष्पादित करने के लिए तेज़ हो सकता है। लेकिन अगर 'os.walk() 'समाधान पर्याप्त तेज़ है, तो यह अधिक सुरुचिपूर्ण और समझने/संपादित करने में आसान है। –

उत्तर

3

वर्तमान निर्देशिका में फ़ाइलों की सूची के लिए उदाहरण। आप इसे विशिष्ट पथों के लिए विस्तारित कर सकते हैं।

import glob 
movlist = glob.glob('*.mov') 
7

आप फ़ाइल मिलान के लिए recuresive चलने और glob.glob() या fnmatch.filter() के लिए os.walk उपयोग कर सकते हैं():

चेक इस answer

6

मैं ओएस का उपयोग करेंगे प्रत्यय को पकड़ने के लिए निर्देशिका को स्कैन करने के लिए, 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) 
+0

यह शायद सबसे अच्छा समाधान है क्योंकि इसे केस-असंवेदनशील मिलान को लागू करने के लिए आसानी से अनुकूलित किया जा सकता है। – ekhumoro

2
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 
+0

[fnmatch] (http://docs.python.org/library/fnmatch.html#module-fnmatch) मॉड्यूल केवल बहुत ही सरल ग्लोब पैटर्न का समर्थन करता है, इसलिए आपका फ़िल्टर काम नहीं करेगा। – ekhumoro

+0

@ekhumoro अगर यह काम करता है, प्रतीकों ([],।,?, *,()) को ग्लोब, पायथन परीक्षण कोड की अनुमति है और देखें कि कौन सा काम – Jhonathan

+0

आपका पैटर्न '*। [MovMOVaipg()]' के बराबर है। यह मिलान करेगा, उदाहरण के लिए, '* .i',' * .a', '* .M', आदि, लेकिन _not_' * .MOV', '* .avi', आदि इसे स्वयं के लिए आज़माएं! – ekhumoro

1

पायथन 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")) 
1

मेरा सुझाव 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 में आप अपने एक्सटेंशन की जाँच करें:

यह एक एक लाइनर दृष्टिकोण हो सकता है।

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