Seite 1 von 1

listdir, listpath - Verwirrung

Verfasst: Sonntag 15. März 2009, 14:29
von shadow07
warum bekomme ich, wenn nur Ordner und keine Dateien mit Suchstring gefunden werden, die Ordner unter Dateiliste ? (wenn Dateien oder Dateien und Ordner gefunden werden dann wird beides in die entsprechenden Listen eingefügt)

Code: Alles auswählen

directories = [startDir]
while len(directories)>0:
    directory = directories.pop()
    for name in os.listdir(directory):
        fullpath = os.path.join(directory,name)
        if os.path.isfile(fullpath):
            if fullpath.endswith(Endung) is True and fnmatch.fnmatch(os.path.basename(fullpath.lower()),Suchstring) is True:
                   Dateiliste.append( fullpath )

            else:
               pass

        elif os.path.isdir(fullpath):
            if fnmatch.fnmatch((fullpath.lower()),Suchstring):
               Ordnerliste.append( fullpath )
            directories.append(fullpath) 

Verfasst: Sonntag 15. März 2009, 15:09
von Leonidas
Versuchst du ``os.path.walk``/``os.walk`` nachzuimplementieren oder was willst du mit dem Code bewirken?

Verfasst: Sonntag 15. März 2009, 15:11
von shadow07
Dank für die Mühen!

os.walk ist nicht vorhanden und ich muss auf anderem Wege alle Dateien und Ordner mit 'Suchstring' auflisten

Verfasst: Sonntag 15. März 2009, 15:14
von Leonidas
Dann sollstst du dein Python aktualisieren. ``os.walk`` gibt es schon seit Python 2.3 was vor über 5 Jahren released wurde.

Verfasst: Sonntag 15. März 2009, 15:16
von shadow07
ist eine Adaption von Python, auf die ich keinen Einfluss habe. Auch wenn ich es für mich implementieren würde, käme es für andere nicht in Frage.... (muss also anders gehen, geht ja auch - ähm - fast)

Verfasst: Sonntag 15. März 2009, 15:19
von Leonidas
Aber ``os.path.walk`` existiert, oder?

Verfasst: Sonntag 15. März 2009, 15:22
von shadow07
ImportError: No module named walk

Verfasst: Sonntag 15. März 2009, 15:29
von Leonidas
``import os.path``

Und ein Tutorial, bzw. die Dokumentation von ``os.path`` lesen. Da steht drin wie man damit arbeitet.

Verfasst: Sonntag 15. März 2009, 15:29
von Trundle
`os.path.walk()` ist ja auch eine Funktion und kein Modul, selbiges gilt für `os.walk()`. Also musst du das Modul importieren, in dem die Funktion ist, und nicht versuchen, die Funktion als Modul zu importieren.

Verfasst: Sonntag 15. März 2009, 16:31
von shadow07
ok, erstens: mein Fehler, os.walk ist vorhanden, hatte versucht doppelt zu importieren da es ja mit imort os schon da war

zweitens: habe jetzt etliche Seiten zu os.walk aufgerufen (hier und anderswo), mangels jeglicher englisch-Kenntnisse kapier ich das ganze jedoch überhaupt nich -> gibt es irgendwo eine deutsche Erläuterung dazu?

sonstens: ist aber alles keine Erklärung, warum obiger Code nicht das tut, was ich von ihm erwarte, der Logic (also meiner) nach müsste das doch auch funktionieren und dürfte so nicht reagieren

Verfasst: Sonntag 15. März 2009, 17:51
von Leonidas
shadow07 hat geschrieben:zweitens: habe jetzt etliche Seiten zu os.walk aufgerufen (hier und anderswo), mangels jeglicher englisch-Kenntnisse kapier ich das ganze jedoch überhaupt nich -> gibt es irgendwo eine deutsche Erläuterung dazu?
Schau dir doch mal diesen Post an. Generell findet die Forensuche eine Menge Threads.
shadow07 hat geschrieben:sonstens: ist aber alles keine Erklärung, warum obiger Code nicht das tut, was ich von ihm erwarte, der Logic (also meiner) nach müsste das doch auch funktionieren und dürfte so nicht reagieren
Ja, ich habe aber persönlich keine Lust deinen Code nachzuvollziehen, vor allem bevor man den nicht auf ``os.walk`` portiert - da muss man wenigstens deine Implementation davon nicht auch noch debuggen.

Verfasst: Sonntag 15. März 2009, 18:20
von shadow07
ich hatte ausführlich gesucht und gelesen, nicht nur den genannten, sondern auch das hier:

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
das dumme, ich kapiere die Funktion nicht und schreibe deshalb nur Blödsinn im eigenen Code, z.B.:

Code: Alles auswählen

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

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

    FilteredFiles = myfilter( files )
    if FilteredFiles != []:
        FileList[root] = FilteredFiles
return FileList
= SyntaxError: 'return' outside function

ich möcht doch einfach nur Dateien und Ordner in je einer Liste haben, welche den Variablen Endung und Suchstring entsprechen

edit:
folgendes findet zwar zumindest schon Dateien, jedoch nicht case-intensiv wenn im Suchstring die Gross/Kleinschreibung nicht übereinstimmt:

Code: Alles auswählen

case-insensitive
leider finde ich zu walk case-Insensitive, os.walk case-Insensitive, walk kleinbuchstaben usw. nichts brauchbares

Verfasst: Sonntag 15. März 2009, 23:01
von Leonidas
Wie gesagt, du solltest dir das Python-Tutorial ansehen, dann würdest du auch wissen warum ``return`` außerhalb von Funktionen Quatsch ist.

So schwer ist das nämlich wirklich nicht:

Code: Alles auswählen

import os, os.path, fnmatch

def matchedfiles(top, exts):
    hits = list()
    for dirpath, dirnames, filenames in os.walk(top):
        for filename in filenames:
            if any(fnmatch.fnmatch(filename.lower(), ext) for ext in exts):
                hits.append(os.path.join(dirpath, filename))
    return hits

print matchedfiles('.', ['*.htm?', '*.mp4'])