Undefind Variable

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
cle1986
User
Beiträge: 18
Registriert: Donnerstag 7. September 2006, 12:44

Freitag 22. September 2006, 14:54

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]
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Freitag 22. September 2006, 15:05

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
BlackJack

Freitag 22. September 2006, 15:06

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.
cle1986
User
Beiträge: 18
Registriert: Donnerstag 7. September 2006, 12:44

Montag 25. September 2006, 15:29

Danke!

Mit daten = list() hats funktioniert.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 25. September 2006, 15:35

BlackJack: warum list()?

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

Montag 25. September 2006, 22:51

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. :-)
Antworten