Zip auslesen wie es os.walk tut.

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hallo Pythonfreunde,

Ich brauche etwas was mit eine Zip ohne sie zu entpacken durchläuft und mir Ordner und Dateien Auflistet.
Mein Ziel ist es das Ganze in ein TreeView darzustellen und zwar so:

|-Datei
|-Datei1
|---Ordner-|
#######|-Datei3
#######|-Ordner1-|
##############|-Datei4


Mein Ansatz dazu, aber ich glaube nicht das ich es auf die Art und Weise hinbekomme:

Code: Alles auswählen

def sort_files():
    def remove_string_from_list(element_list, string):
        for i in element_list:
            try:
                element_list.remove(string)
            except ValueError:
                pass
            replace_string = i.replace(string, "")
            if not replace_string:
                element_list.append(replace_string)
                element_list.remove("")
        return element_list
    
    element_list = ['Metadata', 'Control', 'Control', 'Control1', 'de_DE/Control12', 'de_DE/', 'de_de/']
    return_list = []
    for element in element_list:
        if element.count("/") == 0 or len(element.split("/")) == 2:
            if not element.endswith("/") and "/" in element:
                try:
                    item = element.split("/")
                    items = item[0] + "/", item[1] + "/"
                    if not items[0] in return_list: 
                        return_list.append(element.split("/")[0] + "/")
                        element_list = remove_string_from_list(element_list=element_list, string=element.split("/")[0] + "/" or element)
                except ValueError:
                    print "Error"
                
                if element.count("/") == 1:
                    # Last folder with file etc. de_DE/Control12
                    folder, lfile = element.split("/")
                    
            else:
                if not element in return_list: 
                    return_list.append(element)
                    #element_list = remove_string_from_list(element_list=element_list, string=element)       
    return return_list
print sort_files()
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!

Du solltest zunächst mal deinen Code aufräumen und von Fehlern befreien. Zunächst bietet es sich an, die ganze Funktion mal in mehrere Teilfunktionen zu zerlegen. Der momentane Code ist viel zu lang, verworren und komplex, als dass er in eine einzige Funktion gequetscht gehört. Dann kannst du auch gleich den Namen der Funktion anpassen, denn du sortierst keine Dateien, sondern Dateinamen. Falls du überhaupt irgend etwas sortierst, ich habe mir den Code nicht so genau angeschaut.

Weiter solltest du nichts an einer Liste ändern über die du gerade iterierst. Wenn du Elemente hinzufügst oder löscht, dann kommt der Iterator durcheinander. Das löschen aus einer Liste kommt bei dir gleich mehrfach vor. Dann musst du auch keinen ValueError mehr abfangen. Noch schlimmer wird es dadurch, dass du den Fehler einfach ignoriest und so weiter machst, als wäre nichts passiert. Hier hast du offensichtlich nicht verstanden, warum dir ein Fehler um die Ohren fliegt.

Bei der Gelegenheit kannst du dir auch richtige Namensgebung angewöhnen. Deine Namen sind fast alle schlecht gewählt. i und j kommen zwar häufig in for-Schleifen vor, aber nur dann, wenn es sich um ganze Zahlen handelt. Das ist bei dir offensichtlich nicht der Fall. Wähle also einen passenden Namen. Auch replace_string ist ist eine schlecht Wahl, da er nicht den Inhalt beschreibt. Selbiges gilt für return_list. Wenn ein Typ im Namen vorkommt, dann ist das bereits ein Hinweis auf eine schlechte Namenswahl.

Auch element_list ist ein schlecht gewählter Name. Was für Elemente stecken da denn drin? Das sollte beim Namen bereits klar werden. Hinzu kommt noch, dass du diesen Namen gleich zweimal verwendest. Das führt nur zu Verwirrung und sollte vermieden werden. element und item sind auch wieder schlecht gewählte Namen.

Operationen auf Pfaden solltest du nicht händisch machen, sonder mittels os.path. Da gibt es jede Menge nützliche Funktionen für diese Aufgabe, welche auch alle Sonderfälle abdecken.

Das zweite try/expect ist auch wieder sehr abenteuerlich. Einfach nur "Fehler" ausgeben und dann so weitermachen als wäre nichts passiert, ist keine gute Idee. Bei einem Fehler sollte das Programm vernünftig terminieren, ggf. mit einer entpsrechenden Ausnahme, und nicht einfach in einem unbestimmten Zustand weiterlaufen.

Wenn ``element.count("/") == 0`` gilt, dann kann ``element.count("/") == 1`` unmöglich wahr sein. Wenn du einen Ausdruck doppelt verwendest, dann solltest du in an einen Namen binden und diesen verwenden. Das führt zu mehr übersicht.

Auch solltest du auf die Zeilenlänge achten. PEP 8 schlägt maximal 80 Zeichen vor.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Danke für die Hinweise,

Dies war auch noch nicht der richtige Teil.
Dies war nur ein Ansatz zum Testen/Probieren.
Die Namensgebung hätte ich bei den richtigen Code für das Programm verbessert.
Ich weis halt nur nicht wie ich solche Pfade aufteilen soll:
/file
/ordner/ordner/file
/ordner/ordner/ordner/

Dies soll dann so aussehen:

Code: Alles auswählen

{"file" : None, "ordner" : {"ordner" : {"file" : None, "ordner" : {}}}}
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
BlackJack

@jtschoch: Naja, an den Pfadtrennern aufteilen und dann die einzelnen Komponenten durchgehen und dabei in einem verschachtelten Wörterbuch die einzelnen Unterwörterbücher abfragen oder bei Bedarf neu anlegen. Dabei kann `collections.defaultdict()` nützlich sein.

Du weisst ja anscheinend wie *Du* aus einer Liste mit Pfaden ein verschachteltes Wörterbuch erstellen kannst. Also musst Du das nur noch Schritt für Schritt dem Rechner klar machen.
Antworten