2009-07-24 9 views
20

Ho una lista da os.walk. Ma voglio escludere alcune directory e file. So come farlo con le directory:Come filtrare i file (con tipo noto) da os.walk?

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

Ma come posso farlo con i file, che tipo conosco. perché questo non funziona:

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

risposta

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

Un modo conciso di scriverlo, se fate questo molto:

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

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

Naturalmente, exclude_ext va nel pacchetto di utilità appropriata.

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

dovrebbe essere esattamente quello che ti serve:

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

non è e tale risposta è già stata fornita. – SilentGhost

+0

non menzionare anche che non è chiaro cosa hai intenzione di fare nella riga successiva. – SilentGhost

2

Prova questa:

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 

Si tratta di un generatore di espressione che genera funzione lambda. Si passa un percorso e alcune estensioni e invoca os.walk con il percorso, filtra i file con estensioni nell'elenco di estensioni indesiderate utilizzando una comprensione di lista e restituisce il risultato.

(edit:. Rimuovere la dichiarazione .upper() perché ci potrebbe essere una differenza reale tra le estensioni di caso diverso - se si desidera che questo sia case insensitive, aggiungere .upper() dopo os.path.splitext(F)[1] e passare le estensioni in stampatello)

4

e in un altro modo, perché ho appena scritto questo, e poi inciampato su questa domanda:

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

13

escludere più estensioni.

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

Un'altra soluzione potrebbe essere quella di utilizzare le funzioni dal modulo fnmatch:

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

In questo modo si evita tutti i problemi con l'estensione maiuscole/minuscole. Ciò significa che non devi convertire in basso/in alto quando devi abbinare * .JPEG, * .jpeg, * .JPeg, * .Jpeg

0

Il modo più semplice per ignorare un file con un tipo noto è quello di ottenere il percorso e ottenere tutti i file e dopo quel filtro con un "se" la terminazione che vuoi di te non vuole.

for files in os.walk(path): 

    if files.endswith('.type'): 

     ..... 
     ..... 
Problemi correlati