2011-12-24 9 views
5

In Python su un sistema GNU/Linux, qual è il modo più veloce per scansionare ricorsivamente una directory per tutti i file .MOV o .AVI e per memorizzarli in una lista?In Python, il modo più veloce per creare un elenco di file in una directory con una certa estensione

+1

Il più veloce probabilmente implica la scrittura dell'estensione per utilizzare il codice nativo. Ma lo vuoi davvero? –

+0

Anche se non si vuole farlo, a seconda di quanti file e directory stiamo parlando, potrebbe essere più veloce eseguire il comando esterno 'find' piuttosto che elaborare i risultati di' os.walk() '. Ma se la soluzione 'os.walk()' è abbastanza veloce, è più elegante e facile da capire/modificare. –

risposta

3

Esempio per un elenco di file nella directory corrente. È possibile espandere questo per percorsi specifici.

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

È possibile utilizzare os.walk() per camminare recuresive e glob.glob() o fnmatch.filter() per la corrispondenza del file:

Scegli questa answer

6

userei os .walk per scansionare la directory, os.path.splitext per afferrare il suffisso e filtrarli da solo.

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

Questa è probabilmente la soluzione migliore perché può essere facilmente adattata per applicare la corrispondenza senza distinzione tra maiuscole e minuscole. – 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

Il modulo [fnmatch] (http://docs.python.org/library/fnmatch.html#module-fnmatch) supporta solo schemi glob molto semplici, quindi il filtro non funzionerà. – ekhumoro

+0

@ekhumoro se funziona, i simboli ([],.,?, *,()) Sono ammessi a glob, codice di prova python e vedere quale funziona – Jhonathan

+0

Il tuo modello è equivalente a '*. [MovMOVaipg()]'. Questo corrisponderà, ad esempio, '* .i',' * .a', '* .M', ecc, ma _not_' * .MOV', '* .avi', ecc. Provalo per te! – ekhumoro

1

Python 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)) 

Utilizzare uno matching_ext o matching_ext_ci con argomenti la cartella principale e una proroga o una tupla di estensioni:

>>> matching_ext(".", (".mov", ".avi")) 
1

Suggerisco l'uso di os.walk e un attentamente reading of its documentation.

Questo può essere un approccio uno di linea:

[f for root,dirs,files in os.walk('/your/path') for f in files if is_video(f)] 

Dove in is_video di controllare le estensioni.

Problemi correlati