Verzbaum auslesen/speichern...

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 :x Ich weiß allerdings nicht wieso... Kann mir da einer helfen???

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()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
joe

Donnerstag 5. Mai 2005, 15:37

jens hat geschrieben:Hier eine Klasse die einen Verzeichnisbaum einliest.
Warum nutzt du nicht eine der beiden walk-funktionen der standardlib? Die dürften doch eigentlich alle infos liefern, die du brauchst.

Code: Alles auswählen

import os
startdir = ".."
for root, dirs, files in os.walk(startdir):
    print "   " * (root.count(os.sep) - startdir.count(os.sep)),
    print os.path.split(root)[1],
    print files
joe
Antworten