2009-07-24 20 views
20

Tengo una lista de os.walk. Pero quiero excluir algunos directorios y archivos. Sé cómo hacerlo con los directorios:Cómo filtrar archivos (con tipo conocido) de os.walk?

for root, dirs, files in os.walk('C:/My_files/test'): 
    if "Update" in dirs: 
     dirs.remove("Update") 

Pero, ¿cómo puedo hacerlo con los archivos, que tipo que sé. porque esto no funciona:

if "*.dat" in files: 
    files.remove("*.dat") 

Respuesta

2
files = [file for file in files if os.path.splitext(file)[1] != '.dat'] 
3

Una forma concisa de escribirlo, si lo hace mucho:

def exclude_ext(ext): 
    def compare(fn): return os.path.splitext(fn)[1] != ext 
    return compare 

files = filter(exclude_ext(".dat"), files) 

Por supuesto, exclude_ext va en el paquete de utilidades correspondiente.

26
files = [ fi for fi in files if not fi.endswith(".dat") ] 
0

debe ser exactamente lo que necesita:

if thisFile.endswith(".txt"): 
+0

no lo está y tal respuesta ya ha sido proporcionada. – SilentGhost

+0

sin mencionar que no está claro qué vas a hacer en la próxima línea. – SilentGhost

2

Prueba esto:

import os 

skippingWalk = lambda targetDirectory, excludedExtentions: (
    (root, dirs, [F for F in files if os.path.splitext(F)[1] not in excludedExtentions]) 
    for (root, dirs, files) in os.walk(targetDirectory) 
) 

for line in skippingWalk("C:/My_files/test", [".dat"]): 
    print line 

Esta es una expresión generadora generar función lambda. Le pasa una ruta y algunas extensiones e invoca os.walk con la ruta, filtra los archivos con extensiones en la lista de extensiones no deseadas utilizando una lista de comprensión, y devuelve el resultado.

(edit:. Eliminado la declaración .upper() porque puede haber una diferencia real entre las extensiones de diferente caso - si quieres que esto sea sensible a mayúsculas, añadir .upper() después os.path.splitext(F)[1] y pasar extensiones en mayúsculas)

4

y en una forma más, debido a que acabo de escribir esto, y luego tropezado con esta pregunta:

files = filter(lambda file: not file.endswith('.txt'), files)

13

excluir varias extensiones.

files = [ file for file in files if not file.endswith(('.dat','.tar')) ] 
2

Otra solución sería utilizar las funciones del módulo de fnmatch:

def MatchesExtensions(name,extensions=["*.dat", "*.txt", "*.whatever"]): 
    for pattern in extensions: 
    if fnmatch.fnmatch(pattern): 
     return True 
    return False 

esta manera se evita todos los problemas con la extensión mayúsculas/minúsculas. Esto significa que no necesita convertir a menor/superior cuando tiene que coincidir * .JPEG, * .jpeg, * .JPeg, * .Jpeg

0

La manera más fácil de ignorar un archivo con un tipo conocido es obtener la ruta y obtener todos los archivos y después de ese filtro con un "si" la terminación que desea de usted no quiere.

for files in os.walk(path): 

    if files.endswith('.type'): 

     ..... 
     ..... 
Cuestiones relacionadas