2011-12-24 17 views
5

En Python en un sistema GNU/Linux, ¿cuál es la forma más rápida de escanear recursivamente un directorio para todos los archivos .MOV o .AVI, y almacenarlos en una lista?En Python, la forma más rápida de crear una lista de archivos en un directorio con una cierta extensión

+1

Más rápido probablemente implica escribir una extensión para usar código nativo. ¿Pero realmente quieres eso? –

+0

Incluso si no quiere hacer eso, dependiendo de la cantidad de archivos y directorios de los que estamos hablando, podría ser más rápido ejecutar el comando 'find' externo que procesar los resultados de' os.walk() '. Pero si la solución 'os.walk()' es lo suficientemente rápida, es más elegante y fácil de comprender/editar. –

Respuesta

3

Ejemplo de una lista de archivos en el directorio actual. Puede expandir esto para rutas específicas.

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

Puede utilizar os.walk() para caminar y recuresive glob.glob() o fnmatch.filter() para la coincidencia de archivo:

Marque esta answer

6

que haría uso de OS .walk para escanear el directorio, os.path.splitext para tomar el sufijo y filtrarlo yo mismo.

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

Esta es probablemente la mejor solución, ya que se puede adaptar fácilmente para aplicar la coincidencia de mayúsculas y minúsculas. – 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

El módulo [fnmatch] (http://docs.python.org/library/fnmatch.html#module-fnmatch) solo admite patrones glob muy simples, por lo que su filtro no funcionará. – ekhumoro

+0

@ekhumoro si funciona, los símbolos ([],.,?, *,()) Se pueden englobar, el código de prueba de Python y ver cuál funciona – Jhonathan

+0

Su patrón es equivalente a '*. [MovMOVaipg()]'. Esto coincidirá, por ejemplo, '* .i',' * .a', '* .M', etc., pero _not_' * .MOV', '* .avi', etc. ¡Inténtalo por ti mismo! – 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)) 

uso ya sea matching_ext o matching_ext_ci con argumentos la carpeta raíz y una extensión o una tupla de extensiones:

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

Sugiero el uso de os.walk y cuidadosamente reading of its documentation.

Esto puede ser un enfoque de un trazador de líneas:

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

Donde en is_video comprobar sus extensiones.

Cuestiones relacionadas