Iterator für Verzeichnisinhalt

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
feuervogel
User
Beiträge: 28
Registriert: Dienstag 18. September 2007, 14:59

Hallo,

zunächst: Ich weiß, dass es os.listdir() gibt. Leider gibt diese Funktion eine Liste mit Namen zurück. Wenn sich aber _sehr viele_ Dateien in dem Verzeichnis befinden, ist das nicht grade ressourcenschonend. Ich hätte gerne eine Funktion, die mir einen Iterator zurückliefert (so dass ich über den Verzeichnisinhalt je Eintrag iterieren kann so wie ich über die Zeilen einer Datei einzeln iterieren kann).

Gibts sowas und bin ich nur zu blind zum suchen? Wer kann man mir nen Tipp geben, wie man sowas implementiert?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

einfach anstatt

Code: Alles auswählen

for file_ in os.listdir():  print file_

Code: Alles auswählen

for file_ in iter(os.listdir()): print file_
schreiben.
feuervogel
User
Beiträge: 28
Registriert: Dienstag 18. September 2007, 14:59

na gut, ich geb mir die antwort selbst:

man nutze glob.iglob, siehe http://www.python.org/doc/2.5.2/lib/module-glob.html
feuervogel
User
Beiträge: 28
Registriert: Dienstag 18. September 2007, 14:59

derdon hat geschrieben:einfach anstatt

Code: Alles auswählen

for file_ in os.listdir():  print file_

Code: Alles auswählen

for file_ in iter(os.listdir()): print file_
schreiben.
oh, danke!

edit: ähm, verstehe mich nicht falsch, aaaber:

wenn os.listdir() aufgerufen wird, wird doch die liste erzeugt (und steht somit im RAM). dass dann daraus ein iterator gemacht wird, nutzt mir danach ja auch nicht mehr viel...
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Ich hätte gerne eine Funktion, die mir einen Iterator zurückliefert (so dass ich über den Verzeichnisinhalt je Eintrag iterieren kann so wie ich über die Zeilen einer Datei einzeln iterieren kann).
derdon hat dir doch eine Antwort gegeben.

Bevor ich den Inhalt einer Datei oder eines Verzeichnisses ausgeben kann, muss ich diesen halt erst mal erfassen. Da führt für mich (fast) kein Weg dran vorbei.
Ich weiß also nicht, was an so'ner Liste so schlimm sein soll?
Gruß!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Nimm os.walk
lunar

C4S3 hat geschrieben:
Ich hätte gerne eine Funktion, die mir einen Iterator zurückliefert (so dass ich über den Verzeichnisinhalt je Eintrag iterieren kann so wie ich über die Zeilen einer Datei einzeln iterieren kann).
derdon hat dir doch eine Antwort gegeben.
Die war aber falsch. "for i in list_type" ist das gleiche wie "for i in iter(list_type):", die Liste bleibt so oder so im Speicher. Woher sollte der Iterator auch sonst seine Elemente nehmen?
Bevor ich den Inhalt einer Datei oder eines Verzeichnisses ausgeben kann, muss ich diesen halt erst mal erfassen. Da führt für mich (fast) kein Weg dran vorbei.
Daran führt ein Weg vorbei. Auf C-Ebene ist das Abfragen der Verzeichniseinträge ein iterativer Vorgang. "readdir()" gibt jeweils immer nur ein Element zurück.
Ich weiß also nicht, was an so'ner Liste so schlimm sein soll?
Der Speicherverbrauch? Die "Anlaufzeit", bis die Liste erzeugt ist?

@DasIch
os.walk nutzt intern ebenfalls os.listdir, das hilft als gar nichts.
Antworten