Seite 1 von 1

Undefind Variable

Verfasst: Freitag 22. September 2006, 14:54
von cle1986
Ich habe ein Problem mit einer Funktion, in der Daten eines Files in ein Feld geschrieben werden sollen. Ich weiss allerdings nicht, wieviele Zeilen ich einlese. Daher hätte ich die Funktion vorerst mal so gemacht:

Code: Alles auswählen

def datawindow(self,evt):
        self.statusbar.SetStatusText("Lese Daten ein...")
        fileobj = open(self.filet.GetValue(),'r')
        readv = fileobj.readline()
        print readv
        counter = 0
        while True:
           readv = fileobj.readline()
           if readv == '':
               counter = counter+1
           elif '##-START-##' in readv:
               counter = 0
               n = 0
               while True:
                   if readv == '':
                       counter = counter+1
                   elif '##-ENDE-##' in readv:
                       break
                   else:
                       daten[n] = [readv]
                       n=n+1
                       counter = 0
                   readv = fileobj.readline()
               break
                       
           elif readv != '':
               counter = 0
           elif counter > 3:
               break
            
        win = wx.Dialog(self,-1,'Auswahl der Ausgabedaten',size=(500,300))
        #panel = wx.Panel(self,-1)
        sim = wx.Button(win, label='Starte Simulation', pos=(0,250))
        sim.Bind(wx.EVT_BUTTON, self.start)
        abort = wx.Button(win, label='Abbrechen', pos=(100,250))        
        #abort.Bind(wx.EVT_BUTTON, win.EndModal(0))
        right = wx.Button(win, label='-->', pos=(210,100))
        left = wx.Button(win, label='<--', pos=(210,130))
        listleft = wx.ListBox(win, -1, (5,5), (200,225), daten)
        listright = wx.ListBox(win, -1, pos=(290,5), size=(200,225))
        win.ShowModal()
Allerdings bekomme ich für die Variable 'daten' immer eine Fehlermeldung, dass die Variable nicht definiert sei.

Fehlermeldung:
Traceback (most recent call last):
File "Z:\Eclipse\Pysmig\src\main.py", line 194, in datawindow
daten[n] = [readv]
NameError: global name 'daten' is not defined.

Ich hoffe es kann mir jemand weiterhelfen.

Ich habe zwar so ein ähnliches anliegen hier im Forum gefunden, nur hatte derjenige User ein Problem mit einer Forschleife und einem subprocess.

Somit half mir dieses Beispiel nicht weiter[/code]

Verfasst: Freitag 22. September 2006, 15:05
von rayo
Hi

So könnte die Schleife aussehen (kenne halt die Datei nicht, aber so hast du mal ein Codeschnipsel zum selber experimentieren):

Code: Alles auswählen

        self.statusbar.SetStatusText("Lese Daten ein...")
        fileobj = open(self.filet.GetValue(),'r')
        
        daten = []
        inData = False
        for counter, line in enumerate(fileobj):
            if '##-START-##' in line:
               inData = True
            elif '##-ENDE-##' in line:
                inData = False
            elif inData:
                daten.append(line)
Gruss

Verfasst: Freitag 22. September 2006, 15:06
von BlackJack
Deine Zeile sagt, nimm das Objekt `daten` und setzte an Index `n` den das Objekt ``[readv]``. Nur gibt es das Objekt `daten` nicht. Also was sollte der Interpretierer an der Stelle auch anderes machen als eine Ausnahme auszulösen.

Es ist ja auch gar nicht bekannt was für einen Typ `daten` haben soll.

Ich nehme mal an es soll eine Liste sein. Dann musst Du ein Listenobjekt erzeugen ``daten = list()`` und kannst mit der `append()` Methode Objekte an das Ende der Liste anhängen.

Verfasst: Montag 25. September 2006, 15:29
von cle1986
Danke!

Mit daten = list() hats funktioniert.

Verfasst: Montag 25. September 2006, 15:35
von birkenfeld
BlackJack: warum list()?

[] ist kürzer (und auch schneller, aber das ist hier wohl eher nebensächlich :-) )

Verfasst: Montag 25. September 2006, 22:51
von BlackJack
Weil ich's lesbarer finde. Es gibt Zeichensätze/Schriftgrössen da kann man [] und {} nur durch genaueres hinsehen erkennen und nach `list` lässt sich wesentlich einfacher in der Doku suchen als nach "Sonderzeichen".

Wenn man es konsequent nutzt erhöht sich ausserdem die Wahrscheinlichkeit das man eher auf die Nase fällt wenn man `list` an etwas anderes bindet. :-)