2009-07-24 13 views
20

Mam listę z os.walk. Ale chcę wykluczyć niektóre katalogi i pliki. Wiem, jak to zrobić z katalogami:Jak filtrować pliki (znanym typem) z os.walk?

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

Ale jak mogę to zrobić z plikami, które wiem. bo to nie działa:

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

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

Oczywiście exclude_ext idzie w odpowiednim opakowaniu użytkowy:

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

Odpowiedz

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

zwięzły sposób pisania, czy to dużo zrobić.

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

powinien być dokładnie to, czego potrzebujesz:

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

Nie jest i taka odpowiedź już została dostarczona. – SilentGhost

+0

nie wspominając, że nie jest jasne, co zamierzasz zrobić w następnej linii. – SilentGhost

2

Spróbuj tego:

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 

To wyrażenie generator generowanie funkcji lambda. Podajesz mu ścieżkę i kilka rozszerzeń, i wywołuje ona os.walk ze ścieżką, odfiltrowuje pliki z rozszerzeniami na liście niechcianych rozszerzeń, używając do tego listy i zwraca wynik.

(edit:. Usunięto oświadczenie .upper() ponieważ nie może być rzeczywista różnica między rozszerzeniami innym przypadku - jeśli chcesz to być przypadek niewrażliwe, dodać .upper() po os.path.splitext(F)[1] i przekazać rozszerzeń w drukowanymi literami)

4

a w jeszcze jeden sposób, bo po prostu to napisał, a następnie natknęliśmy się na to pytanie:

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

13

Wykluczanie wiele rozszerzeń.

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

Innym rozwiązaniem byłoby, aby korzystać z funkcji z modułu fnmatch:

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

W ten sposób można uniknąć wszelkich kłopotów z górnej/dolnej przedłużenie sprawy. Oznacza to, że nie trzeba konwertować na niższe/wyższe, gdy trzeba dopasować * .JPEG, * .jpeg, * .JPeg, * .Jpeg

0

Najprostszym sposobem zignorowania pliku znanym typem jest uzyskanie ścieżkę i uzyskać wszystkie pliki, a po tym filtrze z "jeśli" zakończenie, którego nie chcesz.

for files in os.walk(path): 

    if files.endswith('.type'): 

     ..... 
     .....