Das deutsche Python-Forum

Diskussionen rund um die Programmiersprache Python
Aktuelle Zeit: Fr Sep 03, 2010 02:07

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Verzbaum auslesen/speichern...
BeitragVerfasst: Do Mai 05, 2005 13:45 
Moderator

Registriert: Di Aug 10, 2004 10:40
Beiträge: 6153
Wohnort: duisburg
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:
#!/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()

_________________

- Python CMS: http://www.pylucid.org
- Mein ohloh Profil


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Verzbaum auslesen/speichern...
BeitragVerfasst: Do Mai 05, 2005 16: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:

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


Nach oben
  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Deutsche Übersetzung durch phpBB.de