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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 11. Dezember 2004, 18:56

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???
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Samstag 11. Dezember 2004, 19:10

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
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 11. Dezember 2004, 19:14

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 :(
Antworten