Verzbaum auslesen/speichern...
Verfasst: Donnerstag 5. Mai 2005, 12:45
Hier eine Klasse die einen Verzeichnisbaum einliest.
Es gibt allerdings noch einen Fehler. Es werden keine Dateien des ersten Verz. eingelesen
Ich weiß allerdings nicht wieso... Kann mir da einer helfen???
Es gibt allerdings noch einen Fehler. Es werden keine Dateien des ersten Verz. eingelesen

Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
PathWalk by JensDiemer (www.jensdiemer.de)
Liest das Dateisystem aus und speichert Verz.-/Datei-Namen
Bugs
----
Dateien werden nicht aus dem ersten Verz. ausgelesen.
"""
__version__ = "0.0.1"
__history__ = """
v0.0.1
- erste Version
"""
import os, sys, time
class pathwalk:
"""
Liest das Dateisystem aus und speichert Verz.-/Datei-Namen
"""
def __init__( self, path, saveFiles = True ):
"""
path - Verz. welches inkl. allen Unterverz. ausgelesen werden soll.
saveFiles - legt fest ob Dateien auch ausgelesen werden sollen.
"""
self.saveFiles = saveFiles
self.dirdata = {}
self.dir_id = -1 # ID des Verz.
self.walk( path ) # Verz. Auslesen
def walk( self, path, parent_id = -1, level = 0 ):
"""
Durchwandert rekursiv >path< und speichert Verz.-/Datei-Namen in self.dirdata ab
"""
current_dirname = path.split(os.sep)[-1]
self.dir_id += 1
self.dirdata[self.dir_id] = {
"name" : current_dirname,
"parent_id" : parent_id,
"level" : level
}
if self.saveFiles:
self.dirdata[self.dir_id]["files"] = []
#~ print " "*(level*3), current_dirname
for diritem in self.caseinsensitive_sort( os.listdir( path ) ):
joined_path = os.path.join( path, diritem )
if os.path.isdir( joined_path ):
# Ist ein Verzeichnis -> reingehen
self.walk( joined_path, self.dir_id, level+1 )
if self.saveFiles and os.path.isfile( joined_path ):
# Abspeichern der Dateien
self.dirdata[self.dir_id]["files"].append( diritem )
if self.saveFiles:
# Dateiliste sortieren
#~ print " "*(level*3), self.dirdata[self.dir_id]["files"]
self.dirdata[self.dir_id]["files"] = self.caseinsensitive_sort( self.dirdata[self.dir_id]["files"] )
def caseinsensitive_sort( self, stringList ):
"""
case-insensitive string comparison sort
doesn't do locale-specific compare
though that would be a nice addition
usage: stringList = caseinsensitive_sort(stringList)
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/170242
"""
tupleList = [(x.lower(), x) for x in stringList]
tupleList.sort()
return [x[1] for x in tupleList]
def dumpdata( self ):
"""
Gespeicherte Daten Ausgeben
"""
print "-"*80
# Nur Verzeichnisliste Ausgeben
for dir_id in self.dirdata:
level = self.dirdata[dir_id]["level"]
level = level * 3
print " "*(level-1), dir_id,"-",self.dirdata[dir_id]["name"],self.dirdata[dir_id]
print "-"*80
if not self.saveFiles:
print "(Dateien wurden nicht eingelesen)"
return
# Alle Daten Ausgeben
for dir_id in self.dirdata:
level = self.dirdata[dir_id]["level"]
level = level * 3
print " "*(level-1), dir_id,"-",self.dirdata[dir_id]
spacer = " "*level
for file in self.dirdata[dir_id]["files"]:
print spacer,file
print "-"*80
if __name__ == "__main__":
print "Lese Verzeichnisdaten ein..."
StartTime = time.time()
MyPathWalk = pathwalk( ".." )
EndTime = time.time()
print "Ausführungszeit: %s" % (EndTime - StartTime)
MyPathWalk.dumpdata()