Seite 1 von 1

Will fnmatch.filter() immer "case-insensitive" hab

Verfasst: Samstag 11. Dezember 2004, 18:56
von jens
Hab hier was gebastelt:

Code: Alles auswählen

import fnmatch

FileList={}
for root, dirs, files in os.walk(pfad):
    FilteredFiles = fnmatch.filter( files, "*.htm?" )
    if FilteredFiles != []:
        FileList[root] = FilteredFiles
Hier kann man sich das Ergebnis anschauen:

Code: Alles auswählen

VerzList = FileList.keys()
VerzList.sort()
for Verz in VerzList:
    print Verz
    print FileList[Verz]

Nun zu meinem eigentlichen Anliegen... der Filter "*.htm?" soll auch Dateien finden die z.B. groß geschrieben sind: "*.HTM?"...

fnmatch ist nur dann "case-insensitive", wenn das Betriebssystem es auch ist... Also mit Win. gibt's kein Problem, aber unter Linux...

Wie bekomme ich immer eine "case-insensitive" Filterung hin???

Verfasst: Samstag 11. Dezember 2004, 19:10
von Milan
Hi. Indem du vor einem Aufruf mit fnmatch.fnmatch beide Sachen mit upcase oder lowercase behandelst. Danach müssen die Sachen aber im Ausgangszustand weitergegeben werden, da es bei Linux sonst zu nicht vorhandenen Dateien kommen könnte :wink:

Code: Alles auswählen

def myfiler(names,pat):
    pat=pat.lower()
    erg=[]
    for name in names:
        if fnmatch.fnmatch(name.lower(),pat):
            erg.append(name)
    return erg

Verfasst: Samstag 11. Dezember 2004, 19:14
von jens
Danke... Da bin ich jetzt nicht drauf gekommen!

Also meine Lösung sieht so aus:

Code: Alles auswählen

def getHTMLfiles( Path ):

    def myfilter( files ):
        result=[]
        for file in files:
            if fnmatch.fnmatch(file.lower(),"*.htm?"):
                result.append(file)
        return result

    FileList={}
    for root, dirs, files in os.walk(Path):

        FilteredFiles = myfilter( files )
        if FilteredFiles != []:
            FileList[root] = FilteredFiles
    return FileList
Ist natürlich nicht die schnellste :(