Erhalte keine Ausgabe!

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Mirela
User
Beiträge: 8
Registriert: Dienstag 7. Oktober 2008, 12:59

Mittwoch 8. Oktober 2008, 10:09

Hallo,

ich hab da ein problem. Python ruft mal die Funktion readlines() mal die darunter stehende Funktion nicht auf obwohl meiner meinung nach der Code richtig ist. Die sache das er mal die Funktion aufruft mal nicht beunruhigt mich.
Kennt jemand das problem und kann mir weiter helfen?

Code: Alles auswählen

from os import *
from os.path import *

class SearchRobot:

    def __init__(self,suchwort,wurzel): 
        self.ergebnis = []
        self.suchwort = suchwort
        self.wurzel = wurzel
        
    def search (self, suchwort, verzeichnis, dateien):
        
        chdir(verzeichnis)
        for datei in dateien:
            if isfile (datei):
           
                index_2=datei.rfind("MeVis-PC.txt")
                result0=datei[index_2:]
                 
                if result0=='MeVis-PC.txt':
                    f = file(datei, 'r')
                    a=[]
                    z = f.readlines()
           
                    for line in z:
                        a=[line]
                 
                        c=str(a)
                        b=c.split(' ')
                        d=' '
                        if d in b:
                            print 'Hallo'
                            d=[]
                         
                            g=str(b) 
                            b=g.split('\\t')
                            e =1
                          
                            while e==g:
                                pass

                                e=+1   
                    f.close()

    def durchsuche(self):
        walk(self.wurzel, self.search, self.suchwort)

# programm

if __name__=='__main__' :
    suche=SearchRobot('WHO', 'K:\Test Datien')
    suche.durchsuche()
Edit (Leonidas): Code-Tags korrigiert.
BlackJack

Mittwoch 8. Oktober 2008, 11:41

Woher willst Du wissen, das `readlines()` nicht aufgerufen wird? Und welche "Funktion darunter"?

Sternchen-Importe sind böse. Du holst Dir da alle Namen, so ca. 200 an der Zahl, aus `os` und `os.path` in den Namensraum des Moduls und überschreibst dabei eingebaute Namen (`open()` mit `os.open()`) und importierte Namen aus einem Modul mit denen aus einem anderen Modul (`os.walk()` mit `os.path.walk()`). Ersteres führt dazu, das Du `file()` zum öffnen von Dateien verwendest, was man nicht tun sollte, weil das in Zukunft (Python 3) nicht mehr möglich sein wird. Letzteres verwirrt den Leser, der überlegen muss, welches `walk()` denn nun letztendlich benutzt wird.

`search()` ist IMHO jetzt schon zu lang und kompliziert, dabei wird dort noch gar nichts mit dem `suchwort` gemacht und noch nichts zu `self.ergebnis` hinzugefügt.

`os.chdir()` sollte man nicht verwenden, weil man damit einen globalen Zustand verändert. Spätestens wenn man das an zwei Stellen im Programm macht, kann es zu Problemen kommen, weil dann eventuell Code ausgeführt wird, der an anderen Stellen liest/schreibt, als man eigentlich dachte.

`a`, `b`, `c`, `d`, `e`, `f`, `z` sind besch…eidene Namen, die so überhaupt nichts aussagen. Durchnummerieren, a la `result0` ist auch nicht besser.

In der inneren Schleife wird's abenteuerlich. Eine Zeile aus einer Datei als einziges Element in eine Liste packen, die in eine Zeichenkette umwandeln, und *das* dann weiter zu verarbeiten ist ein wenig bizarr. Und den Spass wiederholst Du weiter unten auch noch in dem Du eine Zeichenkette an Leerzeichen splittest, und die resultierende Liste auch wieder als Zeichenkette verarbeitest. Danach wird's noch schlimmer: Eine ``while``-Schleife die solange durchlaufen wird, wie die Zahl 1 gleich einer Liste mit Zeichenketten ist -- also *nie*. Weisst Du was Du da tust!? Das sieht verdammt nach "programming by accident" aus, und nicht nach planvollem Vorgehen.

In der ``while``-Schleife ist ein kleiner Zeichendreher. Überleg mal genau was Zeile 43 bewirkt.

So wie's bisher aussieht würde ich persönlich auch keine Klasse bemühen, sondern das mit Funktionen lösen. Die Liste, die das Ergebnis sammelt, kann man auch als Argument bei `walk()` mitgeben. Aber das ist Geschmackssache.

Der Style Guide empfielt nach Kommatas und um binäre Operatoren ein Leerzeichen zu setzen, um die Lesbarkeit zu erleichtern.
Mirela
User
Beiträge: 8
Registriert: Dienstag 7. Oktober 2008, 12:59

Mittwoch 8. Oktober 2008, 12:02

Danke, ich werd dann wohl doch alles änderen müssen.

Ich habe das programm aus einer alten Datei übernommen und dachte mir wenn es funktioniert muss ich nicht viel dran machen. Was ja bis zum gewissen grad ja auch ging.

Mirela
BlackJack

Mittwoch 8. Oktober 2008, 13:04

Vielleicht solltest Du mal das Tutorial aus der Python-Dokumentation durcharbeiten.

Und mal so ins Blaue geraten: Das Programm so wie es da steht "funktioniert" *nie* aber mit anderen Pfaden als 'K:\Test Datien' funktioniert es schon? Falls ja, schau Dir den Pfadnamen noch einmal genau an, ob es *das* Verzeichnis überhaupt gibt. `os.path.walk()` macht nämlich einfach nichts wenn das Wurzelverzeichnis nicht existiert.

Um die unnötige Klasse zu sparen, empfehle ich übrigens `os.walk()`. Das ist IMHO einfacher zu handhaben und die Trennung zwischen Datei- und Verzeichnisnamen wird einem auch schon abgenommen.
Antworten