os.listdir(path) bringt mir None

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich bekomme neben der Liste aller Verzeichniseinträge von path auch einen Wert "None". Wozu?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Kannst du mal ein Beispiel posten? Ich bekommt hier kein None.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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
Zuletzt geändert von droptix am Sonntag 25. Dezember 2005, 11:17, insgesamt 1-mal geändert.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

droptix hat geschrieben:

Code: Alles auswählen

app = lPath.append(sDirEntry)
Append gibt immer None zurück.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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

Schau dir doch lieber os.walk oder das ältere os.path.walk an!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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

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???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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.
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.
Antworten