Seite 1 von 1

os.listdir(path) bringt mir None

Verfasst: Donnerstag 22. Dezember 2005, 20:17
von droptix
Ich bekomme neben der Liste aller Verzeichniseinträge von path auch einen Wert "None". Wozu?

Verfasst: Donnerstag 22. Dezember 2005, 20:25
von Joghurt
Kannst du mal ein Beispiel posten? Ich bekommt hier kein None.

Liegt an was anderem

Verfasst: Samstag 24. Dezember 2005, 03:52
von droptix
Huh, das liegt doch an was anderem, was ich mir allerdings nicht erklären kann. Ich will rekursiv durch ein Verzeichnis wandern und dabei eigentlich nur mittels myList.append(myString) einen String (aktuelles Verzeichnis) an eine Liste (Pfad bis zum aktuellen Verzeichnis) anhängen.

Nach dem append() ist meine Liste plötzlich None. Jemand einen Tipp, woran das liegt?
Achso: Nur falls jetzt jemandem die Idee kommt... Nein, ich möchte nicht die Python-Funktion os.walk() benutzen, weil ich später noch mehr als nur die Verzeichnis- und Dateinamen brauche.
Hier leider nur die Windows-Variante:

Code: Alles auswählen

import os
class Foo:
    def __init__(self):
        # list of directories to snapshot
        dirlist = ["C:\\test\\"]
        
        # create dirlist (for testing purposes)
        if not os.path.exists(dirlist[0]):
            os.mkdir(dirlist[0])
            file("%s\\file1.txt" % dirlist[0], "w")
            file("%s\\file2.txt" % dirlist[0], "w")
            file("%s\\file3.txt" % dirlist[0], "w")
            os.mkdir("%s\\subdir1" % dirlist[0])
            file("%s\\subdir1\\file1.txt" % dirlist[0], "w")
            file("%s\\subdir1\\file2.txt" % dirlist[0], "w")
            os.mkdir("%s\\subdir2" % dirlist[0])
        
        # walk through dirlist
        for dir in dirlist:
            # check if path exists
            if os.path.exists(dir):
                # walk through
                self.walk([dir])
        
    # walk through a path recursively
    def walk(self, lPath):
        print "="*32
        print "%s" % lPath
        print "="*32
        for sDirEntry in os.listdir("\\".join(lPath)):
            # if directory: walk recursively
            if os.path.isdir(os.path.join("\\".join(lPath),sDirEntry)):
                print "%s  : %s" % (type(lPath), lPath)
                print "%s   : %s" % (type(sDirEntry), sDirEntry)
                app = lPath.append(sDirEntry)
                print "after append() : %s" % app
                self.walk(app)

Foo()
Erzeugt folgende Ausgabe:

Code: Alles auswählen

================================
['C:\\test\\']
================================
<type 'list'>  : ['C:\\test\\']
<type 'str'>   : subdir1
after append() : None
================================
None
================================
Traceback (most recent call last):
  File "test.py", line 39, in ?
    Foo()
  File "test.py", line 23, in __init__
    self.walk([dir])
  File "test.py", line 37, in walk
    self.walk(app)
  File "test.py", line 30, in walk
    for sDirEntry in os.listdir("\\".join(lPath)):
TypeError: sequence expected, NoneType found

Re: Liegt an was anderem

Verfasst: Samstag 24. Dezember 2005, 04:58
von Joghurt
droptix hat geschrieben:

Code: Alles auswählen

app = lPath.append(sDirEntry)
Append gibt immer None zurück.

Aaaaah

Verfasst: Samstag 24. Dezember 2005, 11:14
von droptix
Aaaaah! Na es war auch schon ganz schön spät... hab dann auch aufgehört, um lieber heute weiter zu machen. Aber danke, jetzt funzt es natürlich.

Verfasst: Samstag 24. Dezember 2005, 11:33
von jens
Schau dir doch lieber os.walk oder das ältere os.path.walk an!

os.walk reicht mir nicht

Verfasst: Sonntag 25. Dezember 2005, 11:16
von droptix
Wie ich oben bereits postete:
Achso: Nur falls jetzt jemandem die Idee kommt... Nein, ich möchte nicht die Python-Funktion os.walk() benutzen, weil ich später noch mehr als nur die Verzeichnis- und Dateinamen brauche.
Erstens macht das auch nix weiter als mit os.listdir() die Verzeichnisse rekursiv zu durchwandern und zweitens ist das Ergebnis von os.walk() für meine Zwecke nicht passend, da ich zusätzlich noch weitere Dateiinformationen wie Dateigröße und Datum benötige.

Re: os.walk reicht mir nicht

Verfasst: Mittwoch 28. Dezember 2005, 16:32
von jens
Naja, ich seh da kein Problem drin, auch mit os.walk() zusätzlich die benötigten Informationen aus zu lesen... bzw. wo ist der Vorteil, das per Hand über os.list() zu machen???

Will andere Variablen-Struktur

Verfasst: Mittwoch 28. Dezember 2005, 20:53
von droptix
Ich möchte einfach eine "bessere" oder andere Struktur haben, als die von os.walk(). Quasi so hier:

Code: Alles auswählen

allDirs = {
    'dirs' : {
        'C:': {
            'dirs': { ... (rekursiv) ... }
            'files': [ ... (rekursiv) ... ]
        }
    },
    'files': [
        {
            'name': "file1.ext",
            'size': 12334567,
            'md5sum': "wer76824ckwxcqw9xkc4nmqw78yb"
        }
    ]
}
Ich kann das einfach auch besser nachvollziehen und später v.a. aber auch anpassen, da meine Rekursiv-Funktion eine eigene ist. Gefällt mir einfach besser. Sicher kann ich die Struktur aus os.walk() auch in meine bevorzugte umwandeln, aber dann kann ich's auch gleich selber erstellen.

Außerdem ignoriert os.walk() ExceptionErrors von os.listdir(), was ich nicht besonders vorteilhaft finde.

Verfasst: Donnerstag 29. Dezember 2005, 00:00
von BlackJack
Wenn Du etwas mit den Ausnahmen machen möchtest, dann gibt's bei `os.walk()` einen dritten Parameter (`onerror`) bei dem man eine Funktion angeben kann, die dann mit der entsprechenden Ausnahme aufgerufen wird.